ruby方法有什么不同
以下方法的区别是什么?它是如何工作的 方法(x) 方法=(x) ==(x) 我知道ruby方法有什么不同,ruby,operator-overloading,Ruby,Operator Overloading,以下方法的区别是什么?它是如何工作的 方法(x) 方法=(x) ==(x) 我知道方法(x)是如何工作的,它是一种具有必需参数的方法。但我不知道其他方法是如何工作的,何时以及如何使用。我也不知道有什么区别。有人能给我解释一下吗 谢谢 如果你了解第一种方法的工作原理,那么其他两种方法的工作原理是一样的 在Ruby中,一切都是一个对象,方法调用本质上就是向该对象发送消息。通过使/允许方法名更像操作符(==或赋值方法),您会感觉到它是一些内置的Ruby本机逻辑,而它们只是通过查找类继承层次结构上的第一
方法(x)
是如何工作的,它是一种具有必需参数的方法。但我不知道其他方法是如何工作的,何时以及如何使用。我也不知道有什么区别。有人能给我解释一下吗
谢谢 如果你了解第一种方法的工作原理,那么其他两种方法的工作原理是一样的 在Ruby中,一切都是一个对象,方法调用本质上就是向该对象发送消息。通过使/允许方法名更像操作符(
==
或赋值方法),您会感觉到它是一些内置的Ruby本机逻辑,而它们只是通过查找类继承层次结构上的第一个实现来操作
你会发现等式方法在对象类中的某个类层次上被实现,除非你在中间某个地方重写它。
分配方法是由attr\u编写器
(或通过attr\u访问器
)为您创建的。Ruby将self.blah=1理解为self.blah=(1)
研究Ruby中的send
方法来理解消息传递
归结为
self.send("method",123)
self.send("method=",x)
self.send("==", somethingelse)
如果你了解第一种方法的工作原理,那么其他两种方法的工作原理是一样的 在Ruby中,一切都是一个对象,方法调用本质上就是向该对象发送消息。通过使/允许方法名更像操作符(
==
或赋值方法),您会感觉到它是一些内置的Ruby本机逻辑,而它们只是通过查找类继承层次结构上的第一个实现来操作
你会发现等式方法在对象类中的某个类层次上被实现,除非你在中间某个地方重写它。
分配方法是由attr\u编写器
(或通过attr\u访问器
)为您创建的。Ruby将self.blah=1理解为self.blah=(1)
研究Ruby中的send
方法来理解消息传递
归结为
self.send("method",123)
self.send("method=",x)
self.send("==", somethingelse)
从技术上讲,它们都只是名称不同的方法:
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>"
与普通方法还有一些其他区别:
有语法糖,因此您可以在bar=
和bar
或=
和参数之间放置任意数量的空格=
中有sugar,因此您可以省略调用=
,并在实例和
或=
与参数之间放置任意数量的空格=
将始终返回传递的值bar=
可以在实例上调用,即使它声明为bar=
private
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>"
与普通方法还有一些其他区别:
有语法糖,因此您可以在bar=
和bar
或=
和参数之间放置任意数量的空格=
中有sugar,因此您可以省略调用=
,并在实例和
或=
与参数之间放置任意数量的空格=
将始终返回传递的值bar=
可以在实例上调用,即使它声明为bar=
private
method=
是一种用于setter方法(attr\u writer
type things)的命名约定。基本上,可以使用setter更改私有实例变量值。=
是标准Ruby库中的现有方法。这是一个比较条件。但是,当你像在文章中一样为它编写一个方法时,很可能是试图重新定义它。Ruby允许您根据自己的需要更改现有方法。这叫做猴子修补你的问题不清楚。你说的“有什么区别”是什么意思?你说的“它是如何工作的”是什么意思?您是否在问YARV中如何在内部表示方法?还有,这个问题跟你有什么关系?你是在问还是两个都问没有意义,真的吗?method=
是一种用于setter方法的命名约定(attr\u writer
type things)。基本上,可以使用setter更改私有实例变量值。=
是标准Ruby库中的现有方法。这是一个比较条件。但是,当你像在文章中一样为它编写一个方法时,很可能是试图重新定义它。Ruby允许您根据自己的需要更改现有方法。这叫做猴子修补你的问题不清楚。你说的“有什么区别”是什么意思?你说的“它是如何工作的”是什么意思?您是否在问YARV中如何在内部表示方法?还有,这个问题跟你有什么关系?你是在问还是两个都问没有意义,真的?
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