概要
Rubyの学習をしていて何回か何気なく間違えた点をまとめました。中身は順不同で内容もとてもランダムです。
他の人から見たら当たり前すぎて気にも止めないことかもしれません。
1.メソッド内で定数は定義できない。
これは不本意な代入を防ぐ為でしょうか?メソッド内で定数は定義できません。エラーが起こります。
Rubyリファレンスマニュアル(変数・定数)
def method1
CONST = 'I wanna be defined,plz,,,;_;?'
end
p method1 #=>code.rb:2: dynamic constant assignment
2.unless節でelsifは使用できない。
以前にif節と同じノリでelsifを使用したらエラーになりました。それもそのはず、unless節ではelsifは使用できません。
def method1
best_hitter = 'Aaron Judge'
best_pitcher = 'Clayton Kershaw'
unless best_hitter == 'Hank Aaron'
'Study some history boy!'
elsif best_pichter == 'Clayton Kershaw'
'He could be the greatest picher of all time'
end
end
p method1 #=>syntax error, unexpected keyword_elsif, expecting keyword_end
3.パーセント記法の文字列の配列には「,」も「""」もいらない。
私はパーセント記法で配列を書くときに、ついついいつもの文字列配列のノリで「""」や「''」で囲みがちです。
great_singers = %w(Adele Beyoncé EdSheeran JohnLegend)
p great_singers #=>["Adele", "Beyoncé", "EdSheeran", "JohnLegend"]
4.Stringクラスに「+」や「*」はあっても「-」や「/」は定義されていない。
Stringクラスで定義されている計算記号は「+」と「*」だけで、「-」や「/」は定義されていません。
p 'Chris' + 'Brown' #=>"ChrisBrown"
p 'Chris' * 3 #=> "ChrisChrisChris"
p 'Chris Brown' - 'Brown' #=> undefined method `-' for "Chris Brown":String (NoMethodError)
p 'Chris Brown' / 3 #=> undefined method `/' for "Chris Brown":String (NoMethodError)
5.メソッドと変数の探索順位は変数が先
同名のローカル変数、メソッドが存在する場合は変数が先に優先させて表示されます。
world_cup = 'soccer'
def world_cup
p 'Go Mexico!!'
end
p world_cup #=> 'soccer'
6.再代入と破壊的メソッド
再代入はあくまでの入れ物(変数)に違う値を入れ直すだけ(=別の変数を作り直すようなもの)なので、元の変数に影響は与えない。しかし、破壊的メソッドは元の値に変更を加えるのでその値をもつ全てのオブジェクトに影響を与える。
#再代入の例
var1 = 'Soccer'
var2 = var1
var2 = 'Baseball'
p var1 #=> "Soccer"
p var2 #=> "Baseball"
#破壊的メソッドの例
var1 = 'Soccer'
var2 = var1
var2.gsub!(/Soccer/, 'Baseball')
p var1 #=> "Baseball"
p var2 #=> "Baseball"
7.大文字で始まるメソッドの「()」は省略できない
Rubyにおいてメソッド名はhello_world
のようにスネークケース
で定義するのが一般的です。
しかしHelloWorld
のようにキャメルケース
で命名しても間違いではありません。
その場合、メソッドの呼び出しの際に「()」を省略することができません。
def HelloWorld
puts 'Hello World'
end
HelloWorld() #=> Hello World
HelloWorld #=> code5.rb:5:in `<main>': uninitialized constant HelloWorld (NameError)
8.「::」を仕様したメソッドの呼び出し
メソッドの呼び出しには.
以外にも::
を使用することが可能です。
p Time.now #=> 2018-07-18 13:02:46 +0900
p Time::now #=> 2018-07-18 13:02:46 +0900
9.クラスメソッドはクラスオブジェクトに定義された特異メソッド
タイトル通りクラスメソッドはクラスオブジェクトに定義された特異メソッドです。
つまり、メソッドがどのクラスを参照しているかわかるかさえすればクラス外でも定義可能です。
class ClassA
end
def ClassA.class_method
puts "Hello World"
end
ClassA.class_method #=> Hello World