メソッド引数にシンボルを渡す方法を探していて、それを実際に自分のコードに適応した際に起きたので共有します。
特に意味のないコードを書いていますが悪しからず。。。
動作環境
Ruby 2.3.0
※環境によって結果が異なるようです、ご注意ください。
メソッド引数にシンボルをわたす
これはご存知の通りの書き方でいけます。
一応例。
def sorts(data)
@data = data
ary = [a: 'a', b: 'b', d: 'd', c: 'c']
ary.sort do |before, after|
before[@data] <=> after[@data]
end
end
sorts:a
#=> [{:a=>"a", :b=>"b", :d=>"d", :c=>"c"}]
上のコード自体はほとんど意味がないので気にしないでください。
自分のコードでそれっぽく書いただけです。
sortsメソッドにシンボルaを引数に渡しています。
ここまでは大丈夫だと思います。
実際に三項演算子に入れてみる
上のメソッドをそのまま使ってみます。
a = true ? sorts:a : sorts:c
SyntaxError: unexpected tSYMBEG, expecting keyword_do or '{' or '('
a = if true ? sorts:a : sorts:c
^
a = true ? (sorts:a) : (sorts:c)
SyntaxError: unexpected tLABEL
a = true ? (sorts:a) : (sorts:c)
^
三項演算子自体にほとんど意味はないです。
上記のように、true、false評価のところにシンボルを引数としたメソッドをおくとSyntaxError
で弾かれます。
要注意です。。
終わりに
結局if文で書いたのですが、長い時間これに詰まったので、同じ人がいれば注意喚起ということでこの記事は終わりたいと思います。
もしどなたか良い対処法があればコメントくだされば幸いです。
追記(修正)
def sorts(data)
@data = data
ary = [a: 'a', b: 'b', d: 'd', c: 'c']
ary.sort do |before, after|
before[@data] <=> after[@data]
end
end
p sorts(:a)
a = true ? sorts(:a) : sorts(:c)
上記の書き方で解決いたしました、ありがとうございます!
2.3系ではp sorts:a
した場合結果がnilで返ってきてました(動作検証不足です、すみません)。
2.4系だと
p sorts:a
NameError: undefined local variable or method `a' for main:Object
from (pry):8:in `__pry__'
のエラーが出ます。
ご報告・ご指摘ありがとうございます。