首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >与Enum#detect‘with’输出混淆

与Enum#detect‘with’输出混淆
EN

Stack Overflow用户
提问于 2013-03-29 18:32:44
回答 2查看 92关注 0票数 0

enum#detect说:

将每个条目以枚举形式传递到块中。返回第一个不为false的块。如果没有匹配的对象,则调用ifnone并在指定时返回其结果,否则返回nil。

现在我正在尝试以下几点:

代码语言:javascript
复制
nil.call
#NoMethodError: undefined method `call' for nil:NilClass
#       from (irb):13
#       from C:/Ruby200/bin/irb:12:in `<main>'


(1..10).detect(x = 2) { |i| i % 5 == 0 and i % 7 == 0 }
#NoMethodError: undefined method `call' for 2:Fixnum
#       from (irb):15:in `detect'
#       from (irb):15
        from C:/Ruby200/bin/irb:12:in `<main>'

现在,我的问题是,为什么下面没有发生相同的错误:

代码语言:javascript
复制
(1..10).detect(x = nil) { |i| i % 5 == 0 and i % 7 == 0 }
#=> nil
(1..10).detect(x = nil) { |i| p x; i % 5 == 0 and i % 7 == 0 }
#nil
#nil
#nil
#nil
#nil
#nil
#nil
#nil
#nil
#nil
#=> nil
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-03-29 18:37:33

如果您查看detect方法的源代码(在文档页面上单击“查看源代码”),您将看到只有当参数是而不是 nil时,它才会尝试执行call

代码语言:javascript
复制
if (!NIL_P(if_none)) {
  return rb_funcall(if_none, id_call, 0, 0);
}
票数 1
EN

Stack Overflow用户

发布于 2013-03-29 18:38:01

如果没有匹配的对象,则调用ifnone并在指定时返回其结果,否则返回nil。

我认为你对这句话的解析与它的意图不同。这里的意思是:

代码语言:javascript
复制
if no object matches
  if ifnone is set
    return ifnone.call
  else
    return nil
  end
end

如果您传入nil作为参数,那就等于没有设置ifnone,所以不会调用它。只有在传递nil以外的值时,它才会被调用。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15709295

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档