带有 ruby 集合/枚举的炫酷技巧和富有表现力的片段
您最喜欢的 Ruby 集合代码片段是什么?最好它们应该是你的发现,具有表现力,可读性,并为你的编码实践带来一些乐趣。
数组中的模式匹配(对于局部变量和参数):
(a, b), c = [[:a, :b], :c]
[a,b,c]
=> [:a, :b, :c]
(a,), = [[:a]]
a
=> :a
从非数组分配给多个变量:
abc, a, b =* "abc".match(/(a)(b)./)
=> ["abc", "a", "b"]
nil1, =* "abc".match(/xyz/)
=> []
使用相同的表达式初始化数组元素:
5.times.map { 1 }
=> [1,1,1,1]
Array.new(5) { 1 }
=> [1,1,1,1,1]
使用相同的值初始化数组: 对
[2]*5
=>[2,2,2,2,2]
Array.new 5, 2
=>[2,2,2,2,2]
数组的元素求和:
[1,2,3].reduce(0, &:+)
=> 6
查找与条件匹配的所有索引:
a.each_with_index.find_all { |e, i| some_predicate(e) }.map(&:last)
备用 CSS 类:
(1..4).zip(%w[cls1 cls2].cycle)
=> [[1, "cls1"], [2, "cls2"], [3, "cls1"], [4, "cls2"]]
解压缩:
keys, values = {a: 1, b: 2}.to_a.transpose
keys
=> [:a, :b]
探索字符串的布尔成员方法:
"".methods.sort.grep(/\?/)
探索特定于字符串的方法:
"".methods.sort - [].methods
What are your favorite code snippets with ruby collections? Preferably they should be discovery for you, be expressive, readable and introduce some fun in your coding practice.
Pattern-matching in arrays (for local variables and parameters):
(a, b), c = [[:a, :b], :c]
[a,b,c]
=> [:a, :b, :c]
(a,), = [[:a]]
a
=> :a
Assigning from non-arrays to multiple variables:
abc, a, b =* "abc".match(/(a)(b)./)
=> ["abc", "a", "b"]
nil1, =* "abc".match(/xyz/)
=> []
Initialize array elements with the same expression:
5.times.map { 1 }
=> [1,1,1,1]
Array.new(5) { 1 }
=> [1,1,1,1,1]
Initialize array with the same value:
[2]*5
=>[2,2,2,2,2]
Array.new 5, 2
=>[2,2,2,2,2]
Sum elements of an array:
[1,2,3].reduce(0, &:+)
=> 6
Find all indices that match condition:
a.each_with_index.find_all { |e, i| some_predicate(e) }.map(&:last)
Alternate CSS classes:
(1..4).zip(%w[cls1 cls2].cycle)
=> [[1, "cls1"], [2, "cls2"], [3, "cls1"], [4, "cls2"]]
Unzipping:
keys, values = {a: 1, b: 2}.to_a.transpose
keys
=> [:a, :b]
Exploring boolean member methods of a string:
"".methods.sort.grep(/\?/)
Exploring string-specific methods:
"".methods.sort - [].methods
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(6)
带记忆功能的惰性斐波那契数列,取自 Neeraj Singh:
计数排序的实现:
sum
又名前缀和的实现:在这里,我尝试让
Hash#each
产生KeyValuePair 而不是两元素
Array
。令人惊讶的是,在做了如此残酷的猴子补丁之后,有多少代码仍然可以工作。耶,鸭子打字!我一直在尝试让
Enumerable#===
执行递归结构模式匹配。我不知道这是否有任何用处。我什至不知道它是否真的有效。我最近尝试的另一件事是重新实现
Enumerable
中的所有方法,但使用reduce
而不是each
作为基础。在这种情况下,我知道它实际上无法正常工作。Lazy Fibonacci series with memoization, taken from Neeraj Singh:
An implementation of Counting Sort:
An implementation of
sum
aka prefix sum:Here, I experimented with having
Hash#each
yieldKeyValuePair
s instead of two-elementArray
s. It's quite surprising, how much code still works, after doing such a brutal monkey-patch. Yay, duck typing!Something I have been playing around with is making
Enumerable#===
perform recursive structural pattern matching. I have no idea if this is in any way useful. I don't even know if it actually works.Another thing I toyed around with recently was re-implementing all methods in
Enumerable
, but usingreduce
instead ofeach
as the basis. In this case, I know it doesn't actually work properly.从数组初始化多个值:
Initialize multiple values from an array:
我自己的方法是:
用相同的表达式初始化数组元素:
用相同的值初始化数组:对
数组的元素求和:
查找与条件匹配的所有索引:
My own are:
Initialize array elements with same expression:
Initialize array with same value:
Sum elements of an array:
Find all indices that match condition:
不是真正的片段,但我喜欢这些通用结构(我只展示如何使用它们,实现很容易在网络上找到)。
转换数组-> Hash(
to_hash
或mash
,想法是相同的,参见Facets实现):Map + select/detect:你想要做一个映射并仅获得第一个结果(因此
map { ... }.first
效率低下):惰性迭代(lazy_map、lazy_select、...)。例子:
Not really snippets, but I like these generic constructions (I show only how to use them, the implementation is easily found on the web).
Conversion Array -> Hash (
to_hash
ormash
, the idea is the same, see Facets implementation):Map + select/detect: You want to do a map and get only the first result (so a
map { ... }.first
would inefficient):Lazy iterations (lazy_map, lazy_select, ...). Example:
计算满足一个条件或另一个条件的项目数:
count
表示您不必执行i = 0
和i += 1
>。next
意味着您可以完成该块的迭代并仍然提供答案,而不是一直等到最后。(如果您愿意,可以将块的最后两行替换为单行
! secondary_test?(item)
,但这会使它看起来更混乱)Count the number of items that meet either one condition or another:
count
means you don't have to doi = 0
andi += 1
.next
means that you can finish that iteration of the block and still supply the answer, rather than hanging around until the end.(If you wanted, you could replace the last two lines of the block with the single line
! second_test?(item)
, but that'd make it look messier)探索字符串的布尔成员方法:
探索特定于字符串的方法:
Exploring boolean member methods of a string:
Exploring string-specific methods: