以下方法有什么区别?它的功能/工作原理是什么?
方法(x)的
def method(x)
# some codes
end
方法=(x)的
def method=(x)
# some codes
end
==(x)的
def ==(x)
# some codes
end
我知道method(x)
是如何工作的,它是一个带有必需参数的方法。但我不知道其他方法如何工作以及何时以及如何使用。我也不知道区别。有人可以帮我解释一下吗?
谢谢!
答案 0 :(得分:3)
如果您了解第一个如何工作,那么其他两个工作方式相同。
在Ruby中,一切都是对象,方法调用主要是关于向该对象发送消息。通过使方法名称更像运算符(==
或赋值方法),您会感觉它是构建的Ruby本机逻辑中的一些,而不是它们只是通过查找类继承的第一个实现来操作层次结构。
除非你在中间某处覆盖它,否则你会在Object类中找到类层次结构的等式方法实现。
attr_writers
(或attr_accessor
)为您创建了分配方法。 Ruby可以将self.blah = 1
理解为self.blah=(1)
。
研究Ruby中的send
方法以了解消息传递。
归结为
self.send("method",123)
self.send("method=",x)
self.send("==", somethingelse)
答案 1 :(得分: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=
用于将手头对象的实例变量bar
设置为传递的值。它基本上就是你在java中所谓的setter方法。
class Test
def bar=(value)
@bar = value
end
end
test = Test.new
test.bar=(42)
test.inspect # => "#<Test:0x00559a90b06c80 @bar=42>"
惯用法,==
用于判断当前实例是否等于传递的参数。因此,该方法返回布尔值是最合适的。您可以在java中考虑equals
。
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
和=
或=
和参数==
有糖,所以你可以省略调用.
并在实例与==
或==
和参数之间放置任意数量的空格bar=
将始终返回传递的值bar=
可以在实例上调用,即使它已声明为private