学んだことをなぐり書き


begin - end をブロックとして使用する

ruby の {} はハッシュを意味するので簡易ブロックとして使えない。
変わりに begin を使えばブロックとして使える。
hoge ||= begin
  if true
    'true'
  else
    'false'
  end
end
puts hoge
true

大文字で始まる参照は「全て」定数

# これは普通の定数
Hoge = 'aiueo'
# 当然定数に代入しようとすると warning が出る
Hoge = 'hoge'


# 実はクラス定義のただのクラスオブジェクトの参照を格納した定数に過ぎない
class C; end
# 通常の定数に代入しようとする時と同じ warning が出る
# warning: already initialized constant
C = 'class'

# モジュールも一緒
module M; end
M = 'module'

puts C
puts C.class
# Cはすでに String で上書きされてしまっているので new できない
C.new # => error
test.rb:4: warning: already initialized constant Hoge
test.rb:11: warning: already initialized constant C
test.rb:15: warning: already initialized constant M
class
String
test.rb:20: undefined method `new' for "class":String (NoMethodError)

privateルール

# ruby での private とは
# 「明示的なレシーバー(この場合 self や obj)をつけてプライベートメソッドは呼び出すことはできない。」
# 暗黙的なselfレシーバーに対するものでなければならない
class C
  def public_method
    # 明示的なレシーバーをつけた場合たとえ self でも呼び出せない。
    private_method

    begin
      self.private_method
    rescue NoMethodError
      puts 'no method error'
    end
  end

  private
  def private_method; puts 'private'; end
end

obj = C.new
obj.public_method
obj.private_method
private
no method error
test.rb:20: private method `private_method' called for #<C:0x9306340> (NoMethodError)

カーネルメソッド

# module Kernel に追加するとどこでも使えるようになる(グローバル関数のようなもの)
# 当然使うときはよく検証すること
module Kernel
  def aiueo
    puts 'aiueo'
  end
end

aiueo
aiueo

nilガード

# 初期化の時などに使う
# nil, false なら ||= の右側の値を代入
a = nil
p a
a ||= 'aiueo'
p a
a ||= 'foo'
p a
a = false
p a
a ||= 0
p a
a ||= []  # 0 の場合も true なので ||= で代入はされない
p a
nil
"aiueo"
"aiueo"
false
0
0

ArrayでないObjectも全てArrayに揃える

p Array(10)
p Array([10, 20, 30])
p Array(Object.new)
p Array([Object.new, Object.new])
[10]
[10, 20, 30]
[#<Object:0x10016a430>]
[#<Object:0x10016a340>, #<Object:0x10016a318>]

メンバーのみ編集できます