見出し画像

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





この記事が気に入ったらサポートをしてみませんか?