Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ruby方法有什么不同_Ruby_Operator Overloading - Fatal编程技术网

ruby方法有什么不同

ruby方法有什么不同,ruby,operator-overloading,Ruby,Operator Overloading,以下方法的区别是什么?它是如何工作的 方法(x) 方法=(x) ==(x) 我知道方法(x)是如何工作的,它是一种具有必需参数的方法。但我不知道其他方法是如何工作的,何时以及如何使用。我也不知道有什么区别。有人能给我解释一下吗 谢谢 如果你了解第一种方法的工作原理,那么其他两种方法的工作原理是一样的 在Ruby中,一切都是一个对象,方法调用本质上就是向该对象发送消息。通过使/允许方法名更像操作符(==或赋值方法),您会感觉到它是一些内置的Ruby本机逻辑,而它们只是通过查找类继承层次结构上的第一

以下方法的区别是什么?它是如何工作的

方法(x)

方法=(x)

==(x)

我知道
方法(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