ようへいの日々精進XP

よかろうもん

2018 年 07 月 26 日 (木)

ジョギング

  • 香椎浜 x 1 + 香椎浜 x 1
  • 途中で腹痛を起こしてトイレに駆け込むという...
  • バリ暑かった

日課

  • (腕立て x 50 + 腹筋 x 50) x 3

明日は

  • 放送大学の単位認定試験
  • Ruby Gold 4 回目, いい加減にしろ俺

今日のるびぃ ~ 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

以下, 解答.

  1. 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. 1.upto 5 do puts x end
  2. 1.upto(5) do puts x end
  3. 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 を呼び出す

フムフム.