在Ruby中否定`is_a?`

巴拉
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.metharg不是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
阿米特·库玛·古普塔(Amit Kumar Gupta)

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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Ruby'is_a?' 所需的类或模块(TypeError)

来自分类Dev

相当于Ruby'is_a?'的Python

来自分类Dev

Ruby-Instance_of?/ is_a不起作用

来自分类Dev

*:否定参数(ArgumentError)Ruby

来自分类Dev

Ruby字符串变量为.is_a?返回true(Array)

来自分类Dev

如何检查Ruby中是否定义了私有方法

来自分类Dev

dplyr管道中的否定“!”`%>%`

来自分类Dev

否定R中的%in%

来自分类Dev

红宝石:is_a?和instance_of?在基本对象中

来自分类Dev

Ruby-While语句中的否定条件

来自分类Dev

Ruby:否定哈希传递给proc?

来自分类Dev

Ruby-While语句中的否定条件

来自分类Dev

否定Django中的Q对象

来自分类Dev

Agda中的非平凡否定

来自分类Dev

在C中获得否定地址

来自分类Dev

否定Django中的Q对象

来自分类Dev

Agda中的非平凡否定

来自分类Dev

在 Spacy 中删除否定标记并返回否定句

来自分类Dev

考虑否定和否定,计算字符串中的肯定和否定词

来自分类Dev

如何否定JS中的bool内部函数?

来自分类Dev

在F#中创建否定谓词

来自分类Dev

如何否定管道中的布尔值?

来自分类Dev

Lexer中的ANTLR4否定超前

来自分类Dev

如何在AssertJ中否定断言?

来自分类Dev

如何在PROLOG中做出否定事实

来自分类Dev

XPath中的否定-随之而来的欢闹

来自分类Dev

如何在Java中否定条件?

来自分类Dev

否定Django模板中的布尔值

来自分类Dev

否定符号超过Excel中的字符