Rubyの知らなかったこと①
こんにちは、web系エンジニアのみちおです。都内の医療系ベンチャー企業でサーバーサイドエンジニアとして働いています。最近、Ruby技術者認定試験を受けるためにRubyの学習をしているのですが、その際に知らなかったことがあったので記録として残したいと思います。
グローバル変数
命名規則: 先頭に$
スコープ: どこからでも参照可能
メリットとデメリット: どこからでも参照できるため便利。しかし、どこからでも参照できる分管理が難しい。
class Foo
$foo = 'たこ焼き'
def hoge
puts $foo
end
end
------------------
# クラス外からでも呼び出せる
$foo
"たこ焼き"
bar = Foo.new
bar.hoge
たこ焼き
クラス変数
命名規則: 先頭@@
スコープ: そのクラスの全インスタンスから参照可能
メリットとデメリット: 定数と違いクラスメソッドは何回も値を変えられる。
class Foo
@@foo = 'たこ焼き'
def hoge_1
puts @@foo
end
def hoge_2
puts "#{@@foo}です。"
end
end
------------------
bar = Foo.new
bar.hoge_1
たこ焼き
bar.hoge_2
たこ焼きです。
------------------
UFO演算子(比較演算子)
左辺の値が右辺より大きければ1
左辺の値と右辺の値が等しければ0
左辺の値が右辺より小さければ-1
# UFO演算子の例
10 <=> 9
=> 1
10 <=> 10
=> 0
9 <=> 10
=> -1
可変長引数
実引数に「*」をつけると、配列を引数に展開することができる。
def hoge a, *b
b
end
hoge(1, 2, 3)
=> [2, 3]
*演算子を使って配列のjoinメソッドと同じようなことをする
# joinメソッド
[1, 2, 3].join("-")
=> "1-2-3"
# *演算子
[1, 2, 3] * "-"
=> "1-2-3"
for式とeachメソッドのスコープの違い
for式ではスコープが作成されないので、内部の変数は参照可能。
eachメソッドはブロックによってスコープが作成されるので、ブロック外からの参照はできない。
# for式の場合
for i in [1,2,3] do
bar = 1
end
# for式の場合は参照できる
bar
=> 1
# eachメソッドの場合
[1,2,3].each do
bar = 1
end
# eachメソッドの場合はブロック外からの参照はできない
bar
NameError: undefined local variable or method `bar' for main:Object
おまけ プチ問題 その1
x = 0
def hoge
(1..3).each do |i|
x += i
end
puts x
end
hoge
1. 3が表示される。
2. 0が表示される。
3. 例外が発生する。
4. 6が表示される。
おまけ プチ問題 その2
def hoge_1(a, *b)
hoge_2(*b)
end
def hoge_2(c, *d)
d
end
hoge_1(1,2,3,4)
1. [1,2]が表示される。
2. [1,2,3,4]が表示される。
3. 例外が発生する。
4. [3,4]が表示される。
おまけのプチ問題の答え
その1 -> 3
その2 -> 4
この記事が気に入ったらサポートをしてみませんか?