Ruby Gold 認定試験の Ver 3 の勉強時に学んだことを備忘録として残しておく

環境

  • ruby: 3.1.2

Numbered parameters

_1 から始まる _1, _2 で 第一引数, 第二引数の意味となる

以下は同じ意味

h = { a: 1, b: 2, c: 3  }
h.transform_values{|v| v * 2}
#=> {:a=>2, :b=>4, :c=>6}

h.transform_values{_1 * 2}
#=> {:a=>2, :b=>4, :c=>6}

h = { a: 1, b: 2, c: 3  }
h.map{|key, value| [key, value * 2]}.to_h
#=> {:a=>2, :b=>4, :c=>6}

h = { a: 1, b: 2, c: 3  }
h.map{[_1, _2 * 2]}.to_h
#=> {:a=>2, :b=>4, :c=>6}
#=> hash に対して map! はエラーとなる

<<EOF, <<-EOF, <<~EOF の動作の違い

詳細は ヒアドキュメント 参照

<<EOF

print <<EOF      # 識別子 EOF までがリテラルになる
  the string
  next line
EOF

以下と同じ意味

print "  the string\n  next line\n"

<<-EOF

if need_define_foo
  eval <<-EOF   # '<<-' を使うと……
    def foo
      print "foo\n"
    end
  EOF
  #↑終端行をインデントできる
end

<<~EOF

最もインデントが少ない行を基準にして、全ての行の先頭から空白を取り除く
インデントの深さを決定するため、タブやスペースで構成された行は無視されるので注意が必要
ただし、エスケープされたタブやスペースは通常の文字と同じように扱われる

expected_result = <<~SQUIGGLY_HEREDOC
  This would contain specially formatted text.

  That might span many lines
SQUIGGLY_HEREDOC
# => "This would contain specially formatted text.\n" + "\n" + "That might span many lines\n"