メソッド定義でメソッド名の後に等号 ('=') 記号を置くと、どのような効果がありますか? 質問する

メソッド定義でメソッド名の後に等号 ('=') 記号を置くと、どのような効果がありますか? 質問する

私はこれをスクリーンキャストで見ましたが、この場合「=」記号は何をするのか疑問に思いました。

def express_token=(token)
...
end

こういうことなら理解できるのですが -

def express_token(token = nil) 

上記 (2 番目のコード スニペット) は、tokens パラメータのデフォルト値として nil を設定することを意味します。ただし、最初のコード スニペットでは、'=' が括弧の外側にあります。

ベストアンサー1

このスニペットは、仮想属性(または「setter」メソッド) なので、「express_token」は単なるメソッド名であっても、属性のように見えます。例:

class Foo
  def foo=(x)
    puts "OK: x=#{x}"
  end
end
f = Foo.new
f.foo = 123 # => 123
# OK: x=123

オブジェクト「f」には「foo」という名前の属性やインスタンス変数がないので(必要もありません)、この「foo=」メソッドは、代入のように見えるメソッド呼び出しを可能にするための単なる構文上の糖衣です。また、このようなセッターメソッドは、いつもreturnステートメントや最終値に関係なく、引数を返します。

たとえば、「irb」でトップレベルのセッター メソッドを定義している場合、Object クラスにメソッドが暗黙的に追加されるため、動作が少しわかりにくい場合があります。たとえば、次のようになります。

def bar=(y)
  puts "OK: y=#{y}"
end
bar = 123 # => 123, sets the variable "bar".
bar # => 123
Object.new.bar = 123 # => 123, calls our method
# OK: y=123
Object.public_methods.grep /bar/ # => ["bar="]

おすすめ記事