Closed kachick closed 2 years ago
https://bugs.ruby-lang.org/issues/17292 Ruby 3.1 から ES2015 の object shorthand みたいに key と同名変数を省略した記法で Hash の値に突っ込んだり出来るようになったらしい(全く追ってなかった) パターンマッチなりHashなりでアクセス出来るようになったので、こっちの方が叩いてるメソッド的に黒魔術感目減りして良いやも。速度的にもマシっぽい
def via_hash(in: 42)
{in:}.fetch(:in)
end
def via_local_variable_get(in: 42)
binding.local_variable_get(:in)
end
irb(main):027:0> measure
irb(main):028:0> 10000000.times { via_hash(in: 777) }
processing time: 1.686040s
irb(main):029:0> 10000000.times { via_local_variable_get(in: 777) }
processing time: 2.985861s
https://github.com/kachick/ruby-ulid/blob/90ec61c37ffa23336a2746fd060f349237d46a76/lib/ulid.rb#L308-L309
Ruby の Time.at は 2.7辺りからかな?
in
というキーワード引数を渡せるようになっている。使うだけの時は Hash として書ければ問題ないから気にしなかったんだけど、同じ名前のキーワード引数を自前の関数に定義するとローカル引数として取れずsyntax error, unexpected `in' (SyntaxError)
になる。なぜならin
は 予約語だから・・・ これどうにかする方法あるんかなーと思ったら、ローカル変数として定義自体はされているらしくbinding.local_variable_get(:in)
で取れる。なので速攻で別名変数で定義し直すなりすればなんとかなる感・・・もっといい方法があるかはわからないけどメモしておく。 前は解消方法わからなかったんだけど、今回ぐぐったら https://bugs.ruby-lang.org/issues/17533 に当たって助かった。 そっか、正規表現の named capture でローカル変数定義する時にも同じ問題が有るんだ・・・