この記事はOkinawa.rb Advent Calendar 2018の17日目の記事です。
昨日は @yono@github さんのclass_eval の中で定数を定義したときのスコープでした。
明日は @hanachin_ さんのRe: 10分間隔で 10時〜23時台の配列をつくるです。
ASCII以外の大文字でも定数が定義できるようになった
Ruby 2.6の新機能です。
ASCII以外の大文字でも定数を定義出来るようになりました
https://www.ruby-lang.org/ja/news/2018/12/15/ruby-2-6-0-rc2-released/
ASCII以外の大文字が定数になった
逆に言うとASCII以外の大文字ではじまる名前は定数になりました。
定数になって影響を受けそうな機能を2.6.0-rc2を使って見ていきましょう。
ASCII以外の大文字とは
はい
https://www.fileformat.info/info/unicode/category/Lu/list.htm
https://www.fileformat.info/info/unicode/category/Lt/list.htm
具体的な処理はこのあたり
https://github.com/ruby/ruby/blob/v2_6_0_rc2/symbol.c#L202-L236
定数になったか確認してみよう
defined?
が"constant"
を返す
% ruby='𝐀=42; p defined?(𝐀)'; RBENV_VERSION=2.5.3 ruby -ve $ruby; RBENV_VERSION=2.6.0-rc2 ruby -ve $ruby;
ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux]
"local-variable"
ruby 2.6.0rc2 (2018-12-15 trunk 66408) [x86_64-linux]
"constant"
ローカル変数をBinding#local_variable_set
で設定してみる
% ruby='binding.local_variable_set(:𝐀, 42)'; RBENV_VERSION=2.5.3 ruby -ve $ruby; RBENV_VERSION=2.6.0-rc2 ruby -ve $ruby;
ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux]
ruby 2.6.0rc2 (2018-12-15 trunk 66408) [x86_64-linux]
Traceback (most recent call last):
1: from -e:1:in `<main>'
-e:1:in `local_variable_set': wrong local variable name `𝐀' for #<Binding:0x0000556103d9c880> (NameError)
できない
正規表現の名前付きキャプチャでローカル変数が自動で定義されるかどうか
% ruby='/(?<𝐀>a)/ =~ "a"; p binding.local_variables; p 𝐀'; RBENV_VERSION=2.5.3 ruby -ve $ruby; RBENV_VERSION=2.6.0-rc2 ruby -ve $ruby;
ruby 2.5.3p105 (2018-10-18 revision 65156) [x86_64-linux]
[:𝐀]
"a"
ruby 2.6.0rc2 (2018-12-15 trunk 66408) [x86_64-linux]
[]
"a"
ローカル変数は自動で定義されないが定数が定義される(?)
% ruby='class 𝐀; end; /(?<𝐀>a)/ =~ "a"; p 𝐀'; RBENV_VERSION=2.6.0-rc2 ruby -ve $ruby;
ruby 2.6.0rc2 (2018-12-15 trunk 66408) [x86_64-linux]
-e:1: warning: already initialized constant 𝐀
-e:1: warning: previous definition of 𝐀 was here
"a"
% ruby='class C; end; /(?<C>a)/ =~ "a"; p C'; RBENV_VERSION=2.6.0-rc2 ruby -ve $ruby;
ruby 2.6.0rc2 (2018-12-15 trunk 66408) [x86_64-linux]
C
オッ
まとめ
オッと思って報告した
https://bugs.ruby-lang.org/issues/15437
シュッとなおっていた
https://github.com/ruby/ruby/commit/f89238ec0d689f3989c55c4716da500b8c898900
n0kada さんすごい
新機能みかけたら、みんながやらない使い方を試すといいですね