覆盖==相等运算符仅在一个方向上起作用

时间:2017-08-22 19:35:29

标签: ruby oop operator-overloading override equality

考虑下一个示例,我会覆盖amount = 0 while True: amount = input("Hit me with your best num!") try: amount = int(amount) if amount < 0: print("That number is too tiny!") elif amount > 6: print("That number is yuge!") else: print("what a boring number, but I'll take it") break # How you exit this loop except ValueError: print("Wow dude, that's like not even a number") 运算符以不断返回int()

+

然而,这仅适用于一个方向:

-

有没有办法强制这种相等方法反向工作?

3 个答案:

答案 0 :(得分:1)

如果不改变其他课程,这是不可能的。基本上a == b等于a.==(b)。因此,如果要使其工作,则需要覆盖第二个类的==运算符。

答案 1 :(得分:1)

  

有没有办法强制这种相等方法也能反向工作?

不,但您可以更改public void MarkOnline(string offline) { } 以识别public IQueryable<VistaLCPreview> GetData() { return db.Data; } 的特殊情况。

Hash#==

如果我是你,我不会这样做。

答案 2 :(得分:1)

不,这是不可能的。

Ruby是一种面向对象的语言。 OO的基本思想是你向对象和接收者对象发送消息,而只有接收者对象才能决定如何响应该消息。

  • 如果您将消息==发送到对象a,将对象b作为参数传递,则a a单独决定如何回应。
  • 如果您将消息==发送到对象b,将对象a作为参数传递,则b b单独决定如何回应。

唯一方式确保提供相同的响应,如果ab合作并且同意给予相同的响应。

理论上可以设计一种语言,a == b不是发送给ab的消息,而是发送给某些第三个&#34;上下文对象&#34;。 IOW,a == b不会被解释为a.==(b)b.==(a),而是some_context_object.==(a, b)(例如,上下文对象可能就是您自己,即self.==(a, b))。在这种情况下,上下文对象可以访问ab public API,并可以采取措施确保==是可交换的。

但总的来说,根据OO的基本性质,消息是非交换的,接收者对象是特殊的。