ようへいの日々精進XP

よかろうもん

2018 年 04 月 10 日(火)

ジョギング

  • 香椎浜 x 2 周
  • 右足薬指復活した感

日課

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

パスタ

  • ちょっと趣向を変えて作ってみた
  • ソースとパスタの量のバランスが良くなくて味がぼやっとしてしまった

明日から

  • 2 泊 3 日で東京出張

今日のるびぃ ~ Ruby 技術者認定試験 Gold 演習問題を解いていく (20) ~

もう何度か解いているけど, Ruby 技術者認定試験合格教本 の演習問題と模擬試験を数問ずつ解いていく. ポイントは, 問題が何について問われているかがちゃんと理解出来ていること.

Q28. 実行環境

以下のコードはプログラムファイル名を出力する. [ x ] に記述する適切なコードを選べ.

puts [ x ]

$0

以下, irb での実行例.

irb(main):001:0> puts $0
irb
=> nil

以下, Ruby スクリプトでの実行例.

$ cat 28.rb 
puts $0
$ ruby 28.rb 
28.rb

以下, 解説より引用.

プログラムファイルの名前は, グローバル変数 $0 に格納されます.

$PROGRAM_NAME というグローバル変数も用意されている.

$ irb
irb(main):002:0> puts $PROGRAM_NAME
irb
=> nil

$1 以降は最後に成功したパターンマッチで n 番目の括弧にマッチした値が格納される.

irb(main):001:0> str = '<p><a href="http://example.com">example.com</a></p>'
=> "<p><a href=\"http://example.com\">example.com</a></p>"
irb(main):002:0> if %r[<a href="(.*?)">(.*?)</a>] =~ str
irb(main):003:1>   puts $1
irb(main):004:1>   puts $2
irb(main):005:1> end
http://example.com
example.com
=> nil

Q29. 文法

以下のコードを実行した結果はどうなるか.

a, b, c = [1, 2]
puts a
puts b
puts c

以下のようになるはず.

1
2
nil

以下, irb による実行例.

irb(main):006:0> a, b, c = [1, 2]
=> [1, 2]
irb(main):007:0> puts a
1
=> nil
irb(main):008:0> puts b
2
=> nil
irb(main):009:0> puts c

=> nil

以下, 解説より抜粋.

  • 多重代入
  • 多重代入において左辺の要素数が右辺より多い場合, 余った左辺の要素には nil が代入される

Q30. 標準添付ライブラリ

以下のコードを実行するとどうなるか.

array = [1, 2, 3].freeze
array += [4, 5]
p array
  1. [1, 2, 3, 4. 5] と表示される

以下, irb での実行例.

irb(main):010:0> array = [1, 2, 3].freeze
=> [1, 2, 3]
irb(main):011:0> array += [4, 5]
=> [1, 2, 3, 4, 5]
irb(main):012:0> p array
[1, 2, 3, 4, 5]
=> [1, 2, 3, 4, 5]

以下, 解説より抜粋.

  • freeze はオブジェクトの内容の変更を禁止するが, 参照変数自体は変更可能
  • 出題コードでは, 変数 array を破壊的な変更 (concatuniq! 等)は出来ないが, array が別の配列を参照するように変更は可能

以下, ドキュメントより引用.

凍結されるのはオブジェクトであり、変数ではありません。代入などで変数の指す オブジェクトが変化してしまうことは freeze では防げません。 freeze が防ぐのは、 `破壊的な操作' と呼ばれるもの一般です

フムフム