kachick / times_kachick

`#times_kachick channel in chat` as a public repository. Personal Note and TODOs
https://github.com/kachick/times_kachick/issues?q=is%3Aissue+is%3Aclosed
6 stars 0 forks source link

2022-07-18 - キーワード引数とか named capture 経由で定義された、予約語と同名なローカル変数の取り回し方 #183

Closed kachick closed 2 years ago

kachick commented 2 years ago

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 でローカル変数定義する時にも同じ問題が有るんだ・・・

kachick commented 1 year 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