rubyのblockの評価

gold対策。(基礎力確認問題6)

<p>Hello World.</p>

と出力させるメソッド定義を選択させる問題が出題されました。
(多分正解したはず。)
 
yieldで出力させる方法と、Procオブジェクトとして扱う方法があります。

def tag t
  print "<#{t}>#{yield}</#{t}>"
end

tag(:p){ 'Hello World.' }
def tag(t, &block)
  print "<#{t}>#{block.call}</#{t}>"
end

tag(:p){ 'Hello World.' }

rubyのメソッド内で定数は定義できない

gold対策。

class C
  def foo
    CONST = 'aaa'
  end
end
# ~> -:3: dynamic constant assignment
# ~>     CONST = 'aaa'
# ~>

これは単純に知らなかったのですが、メソッド内で定数は定義できません。  
 
(基礎力確認問題5)こっちはエラー内容は同じですが メソッド内にて定数を変更しようとしているところでエラーとなっています。 (コメントもらって、subjectに合わせて内容修正しました。thanks)

$ cat -n k05.rb
     1 #!/usr/bin/env ruby -w
     2 class C
     3   VAR = 0
     4   def VAR= v
     5     VAR= v
     6   end
     7   def VAR
     8     VAR
     9   end
    10 end
    11
    12 c = C.new
    13 c.VAR = 3
    14 puts c.VAR
    15
k05.rb:5: dynamic constant assignment
    VAR= v

rubyの配列展開について

gold対策(基礎力確認問題2)。
 

通常の配列展開

はこんな感じ。
p で警告はでますが出力はされます。

a = [0, 1, 2]
p a
p *a # !> `*' interpreted as argument prefix
# >> 0
# >> 1
# >> 2

*付き変数に突っ込む

実コードでは、あんまりやらないとは思いますが
試験でもこれっぽいのが出て間違えてしまった気がします。

x, *y = *[0, 1, 2]
p x # => 0
p y # => [1, 2]
x, *y = [0, 1, 2]
p x # => 0
p y # => [1, 2]

ここで右辺の*はなくても一緒。
どうでもいいですが、ここら辺は重箱の隅というか引っかけという感があります。
 

変数と配列の要素数が異なる場合

x, y = [0, 1, 2]
p x # => 0
p y # => 1

a, b, c, d = [0, 1, 2] # !> assigned but unused variable - d
p a # => 0
p b # => 1
p c # => 2
p d # >> nil

変数の方が多い場合は警告が出ます。