技術的にはつまるところ、彼らは異なる名前を持つだけの方法が全てです:彼らはどのように使用されるかについては
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
出典
2016-08-28 12:30:47
ndn
'メソッドを宣言していても場合、インスタンス上で呼び出すことができる
bar=
を渡された値を=返します'命名規則がありますsetterメソッド( 'attr_writer'型のもの)に使われます。基本的に、プライベートインスタンス変数の値は、セッターを使用して変更できます。 '=='は標準のRubyライブラリの既存のメソッドです。条件付きのコンパレータです。しかし、あなたがあなたの投稿のようにそれのためのメソッドを書くとき、それを再定義しようとする可能性が最も高いです。 Rubyでは、独自のニーズに合わせて既存のメソッドを変更することができます。これは猿のパッチと呼ばれています –あなたの質問は不明です。違いは何ですか? 「どのように機能するか」とはどういう意味ですか?方法がYARVの内部でどのように表現されているかを尋ねていますか?また、この質問は[タグ:ruby-on-rails]と何が関係していますか?そしてあなたは[tag:ruby-on-rails-3]や[tag:ruby-on-rails-4]について質問していますが、本当に両方について質問するのは意味がありませんか? –