ジョギング
日課
- (腕立て x 50 + 腹筋 x 50) x 3
明日は
今日のるびぃ ~ Ruby 技術者認定試験合格教本 (Silver/Gold 対応) Ruby 公式資格教科書 模擬試験 (16) 文法 (6) ~
irb に動作確認環境は以下の通り.
$ ruby --version ruby 2.1.10p492 (2016-04-01 revision 54464) [x86_64-linux] $ irb --version irb 0.9.6(09/06/30)
文法 (17)
Q5. 以下のコードを実行するとどうなるか.
class C VAR = 0 def VAR=v VAR = v end def VAR VAR end end c = C.new c.VAR = 3 puts c.VAR
以下, 解答.
- 4 行目でエラーが発生
以下, irb にて確認.
irb(main):010:0> class C irb(main):011:1> VAR = 0 irb(main):012:1> def VAR=v irb(main):013:2> VAR = v irb(main):014:2> end irb(main):015:1> def VAR irb(main):016:2> VAR irb(main):017:2> end irb(main):018:1> end SyntaxError: (irb):13: dynamic constant assignment VAR = v ...
以下, 解説より抜粋.
- メソッド内の定数更新は, そもそもコンパイルエラーとなる
文法 (18)
Q6. 以下のコードの中で文法として正しいものを全て選べ.
以下, 解答.
- 1.upto 5 do puts x end
- 1.upto(5) do puts x end
- 1.upto(5) { puts x }
以下, irb にて確認.
irb(main):001:0> 1.upto 5 do |x| puts x end 1 2 3 4 5 => 1 irb(main):002:0> 1.upto(5) do |x| puts x end 1 2 3 4 5 => 1 irb(main):003:0> 1.upto(5) { |x| puts x } 1 2 3 4 5 => 1 irb(main):004:0> 1.upto 5 { |x| puts x } SyntaxError: (irb):4: syntax error, unexpected '{', expecting end-of-input 1.upto 5 { |x| puts x } ^
以下, 解説より抜粋.
- ブロック引数を
{ ... }
で囲む場合には引数の()
を省略することは出来ない do ... end
で囲む場合には, 引数の()
を省略することは出来る
文法 (19)
Q7. 以下の実行結果になるように [ x ] に記述する適切なコードを全て選べ.
# コード [ x ] tag(:p) {'Hello, World.'} # 実行結果 <p>Hello, World.</p>
以下, 解答.
# 解答 1 def tag(name) puts "<#{name}>#{yield}<#{name}>" end # 解答 2 def tag(name, &block) puts "<#{name}>#{block.call}<#{name}>" end
以下, irb にて確認.
# 解答 1 irb(main):001:0> def tag(name) irb(main):002:1> puts "<#{name}>#{yield}<#{name}>" irb(main):003:1> end => :tag irb(main):004:0> tag(:p) {'Hello, World.'} <p>Hello, World.<p> => nil # 解答 2 irb(main):005:0> def tag(name, &block) irb(main):006:1> puts "<#{name}>#{block.call}<#{name}>" irb(main):007:1> end => :tag irb(main):008:0> tag(:p) {'Hello, World.'} <p>Hello, World.<p> => nil
以下, 解説より抜粋.
- ブロック付きメソッドから呼び出し元のブロックを実行するには,
yield
を使うか, 引数に&
を付けた変数を定義し, ブロックを Proc オブジェクトとして取得してから, Proc#call を呼び出す
フムフム.