2016-08-28 16 views
1

次のメソッドとはどのような違いがあり、どのように機能するのですか?ルビーメソッドの相違点

方法(X)

def method(x) 
    # some codes 
end 

方法=(X)

def method=(x) 
    # some codes 
end 

==(X)

def ==(x) 
    # some codes 
end 

どのようにmethod(x)が動作するかは、必須パラメータのメソッドです。しかし、私は他の方法がどのように働いているのか、いつどのように使用するのか分かりません。また、私は違いを知らない。誰か私のためにそれを説明することはできますか?

ありがとうございます!

+0

'メソッドを宣言していても場合、インスタンス上で呼び出すことができる

  • bar=を渡された値を=返します'命名規則がありますsetterメソッド( 'attr_writer'型のもの)に使われます。基本的に、プライベートインスタンス変数の値は、セッターを使用して変更できます。 '=='は標準のRubyライブラリの既存のメソッドです。条件付きのコンパレータです。しかし、あなたがあなたの投稿のようにそれのためのメソッドを書くとき、それを再定義しようとする可能性が最も高いです。 Rubyでは、独自のニーズに合わせて既存のメソッドを変更することができます。これは猿のパッチと呼ばれています –

  • +2

    あなたの質問は不明です。違いは何ですか? 「どのように機能するか」とはどういう意味ですか?方法がYARVの内部でどのように表現されているかを尋ねていますか?また、この質問は[タグ:ruby-on-rails]と何が関係していますか?そしてあなたは[tag:ruby-on-rails-3]や[tag:ruby-on-rails-4]について質問していますが、本当に両方について質問するのは意味がありませんか? –

    答えて

    2

    技術的にはつまるところ、彼らは異なる名前を持つだけの方法が全てです:彼らはどのように使用されるかについては

    class Test 
        def foo(x) 
        puts "foo #{x}" 
        end 
    
        def bar=(x) 
        puts "bar #{x}" 
        end 
    
        def ==(x) 
        puts "== #{x}" 
        end 
    end 
    
    Test.new.foo(42) # foo 42 
    Test.new.bar=(42) # bar 42 
    Test.new.==(42) # == 42 
    

    慣用的に、bar=がありますobjのインスタンス変数barを設定するために使用されます受け渡された値に手を加える。これは基本的にJavaでsetterメソッドと呼ばれるものです。

    class Test 
        def bar=(value) 
        @bar = value 
        end 
    end 
    
    test = Test.new 
    test.bar=(42) 
    test.inspect # => "#<Test:0x00559a90b06c80 @bar=42>" 
    

    慣用的に、==は、現在のインスタンスが渡された引数と等しいかどう伝えるために使用されます。したがって、メソッドがブール値を返すのが最も適切です。あなたはequalsをjavaで考えることができます。

    class Point2D 
        attr_reader :x, :y 
    
        def initialize(x, y) 
        @x = x 
        @y = y 
        end 
    
        def ==(other) 
        @x == other.x and @y == other.y 
        end 
    end 
    
    Point2D.new(3, 4).==(Point2d.new(1, 2)) # => false 
    points = [Point2D.new(3, 4), Point2D.new(5, 4), Point2D.new(6, 6), Point2D.new(3, 4)] 
    points.count Point2D.new(3, 4) # => 2 
    

    通常の方法で他のいくつかの違いがあります:bar=の構文糖があり

    • ので、あなたがbar=または=と引数の間に空白の任意の量を置くことができますが
    • ==には砂糖がありますので、.の呼び出しを省略して、instanc Eおよび==または==と引数
    • bar=常にそれがprivate
    3

    最初の仕組みが分かっていれば、他の2つは同じように動作します。

    Rubyでは、すべてがオブジェクトであり、メソッド呼び出しは基本的にそのオブジェクトにメッセージを送信することに関するものです。メソッド名を演算子(==または代入メソッド)のように少し変更することで、Rubyのネイティブロジックが構築されているように感じることができます。クラス継承階層の最初の実装を見つけるだけで動作します。

    真ん中のどこかでオーバーライドしないかぎり、等価メソッドの実装は、Objectクラスのどこかでクラス階層を上回っています。

    割り当て方法はattr_writers(またはattr_accessor)によって作成されます。 Rubyはself.blah = 1self.blah=(1)と理解しています。

    メッセージを理解するためにRubyでsendメソッドを調べてください。

    self.send("method",123) 
    self.send("method=",x) 
    self.send("==", somethingelse)