Ruby:没有块的选择/查找有啥用吗?

Posted

技术标签:

【中文标题】Ruby:没有块的选择/查找有啥用吗?【英文标题】:Ruby: Is there any use for select/find without a block?Ruby:没有块的选择/查找有什么用吗? 【发布时间】:2017-04-24 21:19:41 【问题描述】:

我有一个惰性求值,我想要一个 map 操作产生的第一个真实结果,我又一次发现自己在我的表达式末尾写了 .find |e| e

这是一个简单的例子;当然,数组和地图块在我的现实生活中是不同的:

[nil, 2, 3, 4].lazy.map |e| e .find  |e| e 

当我必须将块 |e| e 添加到 selectfind 时,我总是有点惊讶/失望,特别是如果它是一个懒惰的评估,因为两者 - 冗余 - 似乎都是身份函数默认:

> [nil, 2, 3, 4].find  |e| e  
 => 2
> [nil, 2, 3, 4].find
 => #<Enumerator: [nil, 2, 3, 4]:find>
> [nil, 2, 3, 4].find.map  |e| e 
 => [nil, 2, 3, 4] 

这个枚举器与从.each 获得的枚举器实际上有什么不同吗?

> [nil, 2, 3, 4].each.map  |e| e 
 => [nil, 2, 3, 4] 

select 类似,但对惰性更无用:

> [nil, 2, 3, 4].select
 => #<Enumerator: [nil, 2, 3, 4]:select>
> [nil, 2, 3, 4].select  |e| e 
 => [2, 3, 4]
> [nil, 2, 3, 4].select.lazy.force   # doing it wrong looks functional!
 => [nil, 2, 3, 4] 
> [nil, 2, 3, 4].lazy.select  |e| e .force
 => [2, 3, 4]
> [nil, 2, 3, 4].lazy.select.force   # same without .force
ArgumentError: tried to call lazy select without a block

这些明显的身份(和ArgumentError!)是否有用,或者只是在未来版本的 Ruby 中提供更好默认值的机会?

【问题讨论】:

cycle 没有块返回一个无限循环的枚举器(即next 可以无限期地应用),所以与其他的略有不同。 【参考方案1】:

首先 - 一个小评论。如果您发现自己在输入 |e| e ,则可以改用&amp;:itself


除此之外,没有块的可枚举方法通常会返回一个枚举器。您可以使用它与枚举器方法链接。例如,考虑:

[1, 2, 3].map.with_index   |n, i| n + i  # => [1, 3, 5]
[1, 2, 3].each.with_index  |n, i| n + i  # => [1, 2, 3]

[1, 2, 3].select.with_index  |n, i| (n + 2 * i).even?  # => [2]

【讨论】:

很好,但是由于 OP 专门要求 select,您可以使用 select 显示一个示例。 嗯,感谢您的快速回复。 select.with_index |_, i| i &gt; 2 确实有道理,但它不适用于懒惰,这似乎有点坑。感谢您对(&amp;:itself) 的引用 - 有趣且可能更高效,但对我的大脑来说不如 |e| e 清晰。 :) @android.weasel,既然你指出了这一点——这很奇怪。你仍然可以用[1, 2, 3].lazy.with_index.select :whatever 来做(不一样,你也会在结果中得到索引),但是wtf,Ruby。 xd select.with_index |_, i| i &gt; 2 将只是 drop(3) 在我链接或应用一个块之前,[1,2,3].each[1,2,3].select 说返回基本相同的枚举数?与 cycle 之类的东西相比,它在应用 Enumerator 方法时的行为略有不同。

以上是关于Ruby:没有块的选择/查找有啥用吗?的主要内容,如果未能解决你的问题,请参考以下文章

default_if_none 在 Django 模板中有啥用吗?

setNeedsDisplay:NO 有啥用吗?

这种定义JS对象的方式有啥用吗?

带有数组的 unique_ptr 有啥用吗?

带有数组的 unique_ptr 有啥用吗?

unity 为啥要做动态骨骼的碰撞,有啥用吗?请问