Ruby技術者認定試験Silver 2.1 学習用の個人的なメモ　その２

# 識別子
## 命名規則
- クラス名
 - 先頭大文字のキャメルケース
- モジュール名
 - 先頭大文字のキャメルケース
- メソッド名
 - 全て小文字のスネークケース
 - boolを返却する場合は後ろに?を付ける
- 定数
 - 全て大文字のスネークケース
- 変数名
 - 全て小文字のスネークケース
- ファイル名
 - 全て小文字のスネークケース


## グローバル変数、クラス変数、インスタンス変数
- クラスメソッド
 - newをしなくてもアクセスできるメソッド
- インスタンスメソッド
 - newをしないとアクセスできないメソッド
- グローバル変数
 - どこからでもアクセス可能な変数
 - 先頭$
- クラス変数
 - クラス内ならどこからでもアクセス可能
- インスタンス変数
 - インスタンスメソッドからならアクセス可能

```hensu.rb
#グローバル変数定義
$global_hensu = 10000

#クラス定義
class Hensu
	#クラス変数定義
	@@kurasu_hensu = 0;

	#初期化
	def initialize
		#インスタンス変数
		@instance_hensu = 0;
	end

	#クラスメソッド定義
	def self.kurasu_method
		@@kurasu_hensu += 100;
		#@instance_hensu += 100; #クラスメソッドからインスタンス変数はアクセス不可
		$global_hensu += 100;
	end

	#インスタンスメソッド定義
	def instance_method
		@@kurasu_hensu += 100;
		@instance_hensu += 100;
		$global_hensu += 100;
	end

	def self.p_kurasu_hensu
		p "クラス変数 --> #{@@kurasu_hensu}"
	end

	def p_instance_hensu
		p "インスタンス変数 --> #{@instance_hensu}"
	end
end

$global_hensu += 100

#インスタンス生成
work = Hensu.new
#インスタンスメソッドコール
work.instance_method
#クラスメソッドコール
Hensu.kurasu_method

#結果出力
p $global_hensu
Hensu.p_kurasu_hensu
work.p_instance_hensu
```

結果

```
% ruby hensu.rb
10300
"クラス変数 --> 200"
"インスタンス変数 --> 100"
```

#数値
##数値リテラル
.0e が１０の二乗のきっかけになると誤解してましたが
ただの小数点にeを挟んでいるだけですね

JISの標準規格
https://ja.wikipedia.org/wiki/%E6%8C%87%E6%95%B0%E8%A1%A8%E8%A8%98#.E8.A1.A8.E8.A8.98.E6.96.B9.E6.B3.95

```suuchi.rb
p +10 #正数
p -10 #負数
p 3.0 #浮動小数点数
p 3.0e2 #3*(10の２乗)
p 3.0e-2 #3*(10のマイナス２乗)
p 3e2 #3*(10の２乗 eを挟んでいるだけ)
p 3.0000000e2 #3*(10の２乗 eを挟んでいるだけ)
```

結果

```
% ruby suuchi.rb
10
-10
3.0
300.0
0.03
300.0
300.0
```

##基数指示子
```sijisi.rb
p 0b0100 # 2進数  -> 4
p 000007 # 8進数  -> 7
p 000070 # 8進数  -> 56
p 0o0070 # 8進数  -> 56
p 0d0070 # 10進数 -> 70
p 0xffff # 16進数 -> 65535
```

##_の利用
桁区切りとかで見やすくのような用途

```test.rb
p 6_5_5_3_5 # -> 65535
```

##?に続く文字（１文字）リテラル
１文字を直接文字コード値で表現できる
コード値が必要な時に便利か

```hatena.rb
p ?R
p ?\C-v #コントロール+V
p ?\M-a #Altキー+a
p ?\n

puts ?R
puts ?\C-v
puts ?\M-a
print "abc" + ?\n + "efg" + "\n"

```

結果

```
% ruby hatena.rb
"R"
"\u0016"
"\xE1"
"\n"
R

�
abc
efg
```

##有理数、複素数のリテラル
約分するイメージ

```yurihuku.rb
p 100/10r # (10/1)
p 10.5r # (21/2)
p 100i # (0+100i)
p 10.5i # (0+10.5i)
```

##UFO演算子
天秤を思い浮かべる 重たい方に１が立つような
ただ、１が返らない場合もあるそうです・・・

```ufo.rb
def ufo(a, b)
	#UFO演算
	case a <=> b
	when 1 then
		p "a=#{a} VS b=#{b} 第一引数 左の値 a が大きいようです"
	when 0 then
		p "a=#{a} VS b=#{b} 同じ値のようです"
	when -1 then
		p "a=#{a} VS b=#{b} 第二引数 右の値 b が大きいようです"
	else
		p "予期せぬ挙動です"
	end
end

ufo(100,10)
ufo(100,100)
ufo(10,100)

```

結果

```
% ruby ufo.rb
"a=100 VS b=10 第一引数 左の値 a が大きいようです"
"a=100 VS b=100 同じ値のようです"
"a=10 VS b=100 第二引数 右の値 b が大きいようです"
```


##自己代入演算子
rubyではインクリメントやデクリメントが存在しない

```jiko.rb
a = 200
a **=2 #200の2乗
p a # --> 40000

a = 200
a **=3 #200の3乗
p a # --> 8000000

```

##数値クラス

```suchiclass.rb
p 4600000000000000000.class            # --> Fixnum
p 4700000000000000000.class            # --> Bignum
p 1.0.class                            # --> Float
p 4600000000000000000.class.superclass # --> Integer
p 4700000000000000000.class.superclass # --> Integer
p 1.0.class.superclass                 # --> Numeric

```


#メソッド
##デフォルト値、キーワード引数
**変数名 というので複数パラメータ（Hash）を渡せる

```method.rb
#デフォルト値
def func01(a,b=200)
	p "func01 a --> #{a} b --> #{b}"
end

#キーワード引数
def func02(a:,b:200, **c)
	p "func02 c --> #{c}"
	p "func02 a --> #{a} b --> #{b}"
end

hash_param = Hash.new
hash_param["key1"] = "key1value"
hash_param["key2"] = "key2value"

func01(100)
func01(100,101)
func02(a:100)
func02(a:100,b:101)
func02(a:100,b:101, c:hash_param)
func02(100) # ArgumentError

```

結果

```
% ruby method.rb
"func01 a --> 100 b --> 200"
"func01 a --> 100 b --> 101"
"func02 c --> {}"
"func02 a --> 100 b --> 200"
"func02 c --> {}"
"func02 a --> 100 b --> 101"
"func02 c --> {:c=>{\"key1\"=>\"key1value\", \"key2\"=>\"key2value\"}}"
"func02 a --> 100 b --> 101"
method.rb:21:in `<main>': missing keyword: a (ArgumentError)
```


#論理値
##IF修飾子や論理演算子を使った代入について
&& と and での動きの違いに注意
if式とif修飾子があり
if修飾子はthenとendが省略されているようなイメージ
||= は初期化されていなければ nilでなければ設定という便利機能

```ronri_enzn.rb
p 1 && 2 # --> 2
p 1 and 2 # --> 1
p (1 and 2) # --> 2

if_val1 = 3 if true
p (if_val1) # --> 3
if_val2 ||= 100
p (if_val2) # --> 100
if_val1 ||= 100
p (if_val1) # --> 3
if_val2 = 200 if false
p (if_val2) # --> 100
```

#文字列
##バックスラッシュ記法
Unicode文字とか続けて表現できたり、垂直タブや改ページ
バックスペースで１文字消えちゃうのとかすごい

```back_slash.rb
puts "\\X  --> " + "[\X]" #ただの文字
puts "\\\\ --> " + "[\\]" #ただの文字
puts "\\n  --> " + "[\n]" #改行
puts "\\r  --> " + "[\r]" #キャリッジリターン
puts "\\t  --> " + "[\t]" #タブ
puts "\\v  --> " + "[\v]" #垂直タブ
puts "\\f  --> " + "[\f]" #改ページ
puts "\\a  --> " + "[\a]" #ビープ音
puts "\\s  --> " + "[\s]" #スペース
puts "\\b  --> " + "[\b]" #バックスペース
puts "\\101  --> " + "[\101]" #8進数での文字表示
puts "\\x41  --> " + "[\x41]" #16進数での文字表示
puts "\\C-x  --> " + "[\C-x]" #Ctrl+x
puts "\\M-x  --> " + "[\M-x]" #Alt+x
puts "\\M-C-x  --> " + "[\M-C-x]" #Alt+Ctrl+x
puts "\\u3090  --> " + "[\u3090]" #Unicode
puts "\\u{3090 3090}  --> " + "[\u{3090 3090}]" #Unicode 複数
puts "\\e  --> " + "[\e]" #エスケープ
```

結果

```
% ruby back_slash.rb
\X  --> [X]
\\ --> [\]
\n  --> [
]
]r  --> [
\t  --> [	]
\v  --> [
         ]
\f  --> [
         ]
\a  --> []
\s  --> [ ]
\b  --> ]
\101  --> [A]
\x41  --> [A]
\C-x  --> []
\M-x  --> [�]
\M-C-x  --> [�-x]
\u3090  --> [ゐ]
\u{3090 3090}  --> [ゐゐ]
\e  --> [
```

##パーセント記法
%Wもなかなかですが、%xが脅威的ですね。

```psent.rb
a = 100
p %[test#{a}]
p %Q[test#{a}]
p %q[test#{a}]
p %s[test#{a}]
p %W[test#{a} test2#{a}]
p %w[test#{a} test2#{a}]
p %x[ps -ef | grep ruby] # コマンド入力ができてしまう
p %r[^[0-9]$] # matchに指定するような正規表現が記載できる
```

結果

```
% ruby psent.rb
"test100"
"test100"
"test\#{a}"
:"test\#{a}"
["test100", "test2100"]
["test\#{a}", "test2\#{a}"]
"  502 28873  6201   0 10:47PM ttys003    0:00.03 ruby psent.rb\n  502 28874 28873   0 10:47PM ttys003    0:00.00 sh -c ps -ef | grep ruby\n  502 28876 28874   0 10:47PM ttys003    0:00.00 grep ruby\n"
/^[0-9]$/
```