11

Ruby を初めて使用するので、 Ruby 内のメソッド定義に関する動作を自分で説明するのに苦労しています。

例を以下に示します...

class Foo
  def do_something(action)
    action.inspect
  end
  def do_something_else=action 
    action.inspect
  end
end

?> f.do_something("drive")
=> "\"drive\""

?> f.do_something_else=("drive")
=> "drive"

最初の例は自明です。私が理解しようとしているのは、2 番目の例の動作です。1 つは文字列リテラルを生成しているように見えて、もう 1 つはそうではないということ以外に、実際には何が起こっているのでしょうか? なぜ私は他のものを使用するのですか?

4

4 に答える 4

14

通常、do_somethingはゲッターで、do_something=はセッターです。

class Foo
  attr_accessor :bar
end

と同等です

class Foo
  def bar
    @bar
  end

  def bar=(value)
    @bar = value
  end
end

動作の違いについての質問に答えるために、で終わるメソッドは=常に式の右側を返します。この場合action、 ではなく を返しaction.inspectます。

class Foo
  def do_something=(action)
    "stop"
  end
end

?> f = Foo.new
?> f.do_something=("drive")
=> "drive"
于 2012-10-10T04:31:04.147 に答える
10

両方のメソッドが実際に定義され、メソッドとして呼び出されています+Rubyでは、 、-*などの演算子でさえ、かなり多くのものをメソッドとして定義できます/。Ruby では、メソッドに 3 つの特別な記法接尾辞を付けることができます。その言葉はすべて自分で作りました。記法接尾辞とは、メソッドの最後にあるものが、そのメソッドがどのように機能するかを示しているということです

バン!

最初の接尾辞!. これは、メソッドがdestructiveであると想定されていることを示します。つまり、メソッドが呼び出されたオブジェクトを変更することを意味します。これら 2 つのスクリプトの出力を比較します。

a = [1, 2, 3]
a.map { |x| x * x }
a

と:

a = [1, 2, 3]
a.map! { |x| x * x }
a

2 つのスクリプトには 1 文字の違いがありますが、動作は異なります。最初のものは配列内の各要素を通過し、ブロック内で操作を実行しますが、オブジェクトは開始時とa同じまま[1,2,3]です。

ただし、2 番目の例では、a代わりに、オブジェクトがその場で変更された[1, 4, 9]ため、最後の が表示されます。map!

クエリ

2 番目の表記接尾辞?, であり、これはメソッドが何かについてオブジェクトをクエリするために使用されることを示し、メソッドが を返すことになっていることtruefalseまたはいくつかの極端な状況では , を意味しnilます。

ここで、メソッドが戻る必要がないことに注意してください。trueまたはfalse...それができればとてもいいというだけです!

証拠:

def a?
  true
end

def b?
  "moo"
end

呼び出すa?と が返さtrueれ、呼び出すb?と "moo" が返されます。以上がクエリメソッドです。一部の開発者は他の開発者を好まないため、返す必要があるメソッドまたはしかし時々他のものを返すことがありますtruefalse

セッター!

、私たちはあなたの(言い換えられた)質問の要点に行き着きます.メソッドの最後にある意味は何ですか?=

これは通常、メソッドが特定の値を設定しようとしていることを示しています。これは、私がこの回答のエッセイを入力し終える前にErikが概説したようにです。

ただし、クエリ メソッドがまたはを返さない場合があるのと同様に、1 つを設定しない場合があります。それはただの慣習です。truefalse

次のようにセッター メソッドを呼び出すこともできます。

foo.something_else="value"

または(私のお気に入り):

foo.something_else = "value"

理論的には、メソッドに渡された引数を完全に無視できるのと同じように、渡された値を実際に無視できます。

def foo?(*args)
  "moo"
end

>> foo?(:please, :oh, :please, :why, :"won't", :you, :use, :these, :arguments, :i, :got, :just, :for, :you, :question_mark?)
=> "moo"

Ruby は setter メソッドの 3 つの構文すべてをサポートしていますが、あなたが使用したものを目にすることはめったにありません!

さて、この回答がおおざっぱな教育的なものであり、Ruby についてより多くのことを理解していただければ幸いです。楽しみ!

于 2012-10-10T04:41:46.443 に答える
3

割り当てメソッドの戻り値を定義することはできません。x = y = z = 3代入チェーン ( ) が常に機能するように、戻り値は渡された値と常に同じです。

通常、メソッドを呼び出すときは括弧を省略して、プロパティのように動作させます。

my_value = f.do_something= "drive"
于 2012-10-10T04:32:14.320 に答える
0
def do_something_else=action 
  action.inspect
end

これは setter メソッドを定義するので、do_something_else は属性を初期化しているように見えます。したがって、初期化された値が直接渡されます。

于 2012-10-10T04:34:54.697 に答える