在Ruby中否定'is_a?'有困难
在在Ruby中否定'is_a?'有困难,ruby,Ruby,在meth中,我想做arg.meth如果arg不是nil,如果arg.is_a?C。否则返回@v。但我猜这部分是!(arg.is_?self.class)不正确。不知道出了什么问题 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
meth
中,我想做arg.meth
如果arg不是nil,如果arg.is_a?C
。否则返回@v
。但我猜这部分是!(arg.is_?self.class)
不正确。不知道出了什么问题
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
我不想否定arg.nil?
我想实现arg.is\u not\u a?
更新:看起来我的问题令人困惑。我想在这里澄清一下
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_?self.class)
如果arg
为nil
且arg
不是self.class
的(子)实例,则将为true。你在中使用这个条件,除非,所以一切都颠倒了:“arg
是nil
”变成“arg
不是nil
”,“arg
不是self.class
”的(子)实例变成了“arg
是self.class
”的(子)实例,最重要的是--“和”变成“或”-这就是你的问题:arg.meth
被调用,如果arg
不是nil
或者arg
是self.class
的(子)实例,但是只有当这两个条件都为真时,你才希望它发生
因此-要么将&
更改为|
,要么将更改为,除非更改为如果(并相应地重写条件)条件(arg.nil?&!(arg.is_?self.class)
如果arg
为nil
且arg
不是self.class
的(子)实例,则将为true。你在中使用这个条件,除非,所以一切都颠倒了:“arg
是nil
”变成“arg
不是nil
”,“arg
不是self.class
”的(子)实例变成了“arg
是self.class
”的(子)实例,最重要的是--“和”变成“或”-这就是你的问题:arg.meth
被调用,如果arg
不是nil
或者arg
是self.class
的(子)实例,但是只有当这两个条件都为真时,你才希望它发生
因此-要么将&
更改为|
,要么将更改为,除非更改为如果(并相应地重写条件)10。nil?
为false,因此(arg.nil?&!(arg.is_?self.class)
为false,并且给定的工作方式,除非工作,否则您的方法将尝试调用10.meth
将该行替换为:
if the argument passed to meth is not nil and is of type C then
call arg.meth
else
return @v
end
或
编辑:因为arg.is_a?self.class
意味着!arg.nil?
以上内容是多余的,实际上应该是:
return arg.meth unless arg.nil? || !(arg.is_a? self.class)
或者,如果您真的想使用,除非:
return arg.meth if arg.is_a? self.class
显式返回不是惯用的Ruby,因此类似这样的东西可能是理想的
return arg.meth unless !(arg.is_a? self.class)
10.nil?
为false,因此(arg.nil?&!(arg.is_?self.class)
为false,并且给定的工作方式,除非工作,否则您的方法将尝试调用10.meth
将该行替换为:
if the argument passed to meth is not nil and is of type C then
call arg.meth
else
return @v
end
或
编辑:因为arg.is_a?self.class
意味着!arg.nil?
以上内容是多余的,实际上应该是:
return arg.meth unless arg.nil? || !(arg.is_a? self.class)
或者,如果您真的想使用,除非:
return arg.meth if arg.is_a? self.class
显式返回不是惯用的Ruby,因此类似这样的东西可能是理想的
return arg.meth unless !(arg.is_a? self.class)
正如你所说-在meth
中,如果arg不是nil
并且如果arg.is_a C
,我想做arg.meth
。否则返回@v
这可以通过在arg
上调用方法#instance_?
来处理。您不需要显式地检查nil
对象。只有当arg
是类C
的实例时,if
语句才会被评估为true
。无论nil
,还是10
都不是类C
的实例,因此arg.meth
不会发生,因为if
子句将被评估为false
。这实际上满足了您的需要。arg.meth
将发生在if
子句中,此时arg
将是类c
的实例。这是发生在这一行的情况x.meth(y)
以下是您试图获取的代码:
def meth(arg=nil)
arg.is_a?(self.class) ? arg.meth : @v
end
正如你所说-在meth
中,如果arg不是nil
并且如果arg.is_a C
,我想做arg.meth
。否则返回@v
这可以通过在arg
上调用方法#instance_?
来处理。您不需要显式地检查nil
对象。只有当arg
是类C
的实例时,if
语句才会被评估为true
。无论nil
,还是10
都不是类C
的实例,因此arg.meth
不会发生,因为if
子句将被评估为false
。这实际上满足了您的需要。arg.meth
将发生在if
子句中,此时arg
将是类c
的实例。这是发生在这一行的情况x.meth(y)
以下是您试图获取的代码:
def meth(arg=nil)
arg.is_a?(self.class) ? arg.meth : @v
end
我试过!(arg.is_?self.class)
在控制台中,它可以工作。我特别试过!(nil.is_?nil.class)
。不清楚您想要什么。。你能告诉我你试图建立的逻辑吗。。?这是干什么用的!(arg.is_是一个?self.class)
?使用的实例不是更好吗?@Andrea你是对的!!我试过!(arg.is_?self.class)
在控制台中,它可以工作。我特别试过!(nil.is_?nil.class)
。不清楚您想要什么。。有限公司