class C
attr_accessor :v
def initialize(arg)
@v = arg
end
def meth(arg=nil)
return arg.meth unless (arg.nil?) && !(arg.is_a? self.class)
@v
end
end
在meth
我想做arg.meth
arg不是nil和if arg.is_a?C
。否则返回@v
。但是我想这部分!(arg.is_a? self.class)
是不正确的。无法找出问题所在。
x = C.new("first")
y = C.new("second")
x.meth #=> "first"
x.meth(y) #=> "second"
x.meth(10) #=> I was expecting 'first'
But I get NoMethodError: undefined method `meth' for 10:Fixnum
我不想否定arg.nil?
我想要实现的目标arg.is_not_a?
更新:看来我的问题令人困惑。我想在这里澄清
if the argument passed to meth is not nil and is of type C then
call arg.meth
else
return @v
end
10.nil?
是错误的,因此(arg.nil?) && !(arg.is_a? self.class)
也是错误的,并且鉴于其unless
工作原理,您的方法将尝试调用10.meth
。
将该行替换为:
return arg.meth if !arg.nil? && (arg.is_a? self.class)
要么
return arg.meth unless arg.nil? || !(arg.is_a? self.class)
编辑:由于arg.is_a? self.class
暗示!arg.nil?
以上是多余的,实际上应该只是:
return arg.meth if arg.is_a? self.class
或者,如果您确实要使用,除非:
return arg.meth unless !(arg.is_a? self.class)
显式返回不是惯用的Ruby,所以类似这样的东西可能是理想的
def meth(arg=nil)
arg.is_a?(self.class) ? arg.meth : @v
end
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句