ブログ記事からの転載です。
Ruby の開発版に右代入演算子と実験的にエンドレスメソッド定義構文が新しく追加されました。
右代入演算子
左辺値を右辺の変数に代入する =>
演算子が新しく追加されました。
これは expression => variable
のように書くことができます。
# 左辺値を右辺の変数に代入する
42 => result
p result
# => 42
# メソッドチェーンの最後に代入演算子を書くことができる
(1..).lazy.select { _1 % 2 == 0 }.map { _1 * 2 } => x
p x.first(10)
# => [4, 8, 12, 16, 20, 24, 28, 32, 36, 40]
=>
を使うことで左から処理を書いて自然とその流れのまま変数に代入する事ができます。
これは書いてて気持ちいいですね。
その反面、変数定義を探す場合、いつも左側を見る癖が付いているので右側に変数定義があると見落としてしまいそうなのがちょっと心配です。
また、次のように演算子を伴う式を左辺で書くとシンタックスエラーになりました。
# syntax error, unexpected =>, expecting end-of-input
1 + 2 => result
これは意図してないような気がするんですがどうなんでしょうね。
[追記]
=>
は Hash を定義する時にも使われており例えば現行の Ruby でも
meth(key => value)
と書くことができます。
なので
meth a => result
というコードは
meth(a) => result
ではなくて
meth(a => result)
と解釈されます。
同様に
1 + 2 => result
も
(1 + 2) => result
ではなくて
1 + (2 => result)
と解釈されるのでえらーになるんですかね?
[追記 2]
1 + 2 => result がエラーになるのはうっかり忘れてたので直した https://t.co/a5lEu1OUaq
— ( Φ _⊞) (@n0kada) 2020年4月12日
とのことで 1 + 2 => result
がエラーになることは意図していなかったらしいです。
最新版では以下のコードが動作します。
1 + 2 => result
result # => 3
演算子の優先順位の問題、意図してるのかどうか判断するのがむずかしいなー。
エンドレスメソッド定義構文
実験的にエンドレスメソッド定義構文が追加されました。
エンドレス、と言っても永遠という意味ではなくて『end
を書かずにメソッドを定義する』という意味のエンドレスです。
これにより def value(args) = expression
という形でメソッドを定義する事ができるようになります。
もともとは今年のエイプリルフールネタで建てられたチケットがそのまま導入された形になります。
これを利用することで以下のような形でメソッドを定義する事ができます。
def hello(name) =
puts("Hello, #{ name }")
hello("endless Ruby") #=> Hello, endless Ruby
def inc(x) = x + 1
p inc(42) #=> 43
x = Object.new
def x.foo = "FOO"
p x.foo #=> "FOO"
def fib(x) =
x < 2 ? x : fib(x-1) + fib(x-2)
p fib(10) #=> 55
これは普通に便利そうですね。
ただし、 def value = 42
のように代入演算子を使用するので以下のような動作を期待するんですが、これはエラーになります。
value = 42
# 外のスコープの値を使用したい
def hoge = value
# error: undefined local variable or method `value' for main:Object (NameError)
p hoge
end
がないことでスコープが曖昧に見えるので個人的には外にある変数はキャプチャされてもいいんじゃないかなあ、と思うんですがどうなんでしょうね。
この構文自体あんまりよく思ってない人もいるようなので今後どうなるのかは気になります。