gpt4 book ai didi

ruby - 你如何覆盖 ruby​​ 大小写相等运算符? (===)

转载 作者:数据小太阳 更新时间:2023-10-29 07:05:27 25 4
gpt4 key购买 nike

我有一个类,我想将它与 case 语句中的字符串和符号进行比较,所以我认为我只是为我的类重写了 ===() 方法,所有这些都是黄金。但是我的 ===() 方法在 case 语句中永远不会被调用。有什么想法吗?

这是一些示例代码,以及在 irb session 中发生的情况:

class A
def initialize(x)
@x=x #note this isn't even required for this example
end
def ===(other)
puts "in ==="
return true
end
end

irb(main):010:0> a=A.new("hi")
=> #
irb(main):011:0> case a
irb(main):012:1> when "hi" then 1
irb(main):013:1> else 2
irb(main):014:1> end
=> 2

(它从不打印消息并且应该总是返回 true)请注意,理想情况下我想做一个

def ===(other)
#puts "in ==="
return @x.===(other)
end

提前致谢。

最佳答案

“case”关键字后的表达式在 === 表达式的右侧,“when”关键字后的表达式在表达式的左侧。因此,被调用的方法是 String.===,而不是 A.===。

反转比较的快速方法:

class Revcomp
def initialize(obj)
@obj = obj
end

def ===(other)
other === @obj
end

def self.rev(obj)
Revcomp.new(obj)
end
end

class Test
def ===(other)
puts "here"
end
end

t = Test.new

case t
when Revcomp.rev("abc")
puts "there"
else
puts "somewhere"
end

关于ruby - 你如何覆盖 ruby​​ 大小写相等运算符? (===),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/629669/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com