Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Ruby中否定'is_a?'有困难_Ruby - Fatal编程技术网

在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)
。不清楚您想要什么。。有限公司