1
2

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.

メソッド引数にシンボルを渡したとき、三項演算子が使えない

Last updated at Posted at 2017-08-25

メソッド引数にシンボルを渡す方法を探していて、それを実際に自分のコードに適応した際に起きたので共有します。

特に意味のないコードを書いていますが悪しからず。。。

動作環境

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__'

のエラーが出ます。

ご報告・ご指摘ありがとうございます。

1
2
6

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
1
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?