ruby方法有什么区别

时间:2016-08-28 05:00:08

标签: ruby operator-overloading

以下方法有什么区别?它的功能/工作原理是什么?

  

方法(x)的

def method(x)
  # some codes
end  
  

方法=(x)的

def method=(x)
  # some codes
end
  

==(x)的

def ==(x)
  # some codes
end

我知道method(x)是如何工作的,它是一个带有必需参数的方法。但我不知道其他方法如何工作以及何时以及如何使用。我也不知道区别。有人可以帮我解释一下吗?

谢谢!

2 个答案:

答案 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
相关问题