3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Ruby 2.6のASCII以外の大文字で定義できる定数を試す

Last updated at Posted at 2018-12-19

この記事は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 さんすごい

新機能みかけたら、みんながやらない使い方を試すといいですね :smile:

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?