解释Ruby数组uniq方法的一个表达式
我理解正则表达式,我不理解uniq块是如何工作的 唯一性的确定基于将每个元素传递到块的结果 例如,第一个表示询问每个元素是否为“a”。第一个回答是肯定的,所以“a”被认为是独一无二的。第二个说不,所以“b”被认为是唯一的。其他人也说不,所以他们并不被认为是独一无二的(因为“不”的回答是我们已经看到的)解释Ruby数组uniq方法的一个表达式,ruby,arrays,uniq,Ruby,Arrays,Uniq,我理解正则表达式,我不理解uniq块是如何工作的 唯一性的确定基于将每个元素传递到块的结果 例如,第一个表示询问每个元素是否为“a”。第一个回答是肯定的,所以“a”被认为是独一无二的。第二个说不,所以“b”被认为是唯一的。其他人也说不,所以他们并不被认为是独一无二的(因为“不”的回答是我们已经看到的) 然而,我不能很容易地解释的是,为什么在Ruby 1.8.7中这似乎对您有效;在1.8.7和之前的版本中,忽略了数组#uniq的块参数。这个特性是在Ruby 1.9中添加的。也许你有一个补丁版本?这
然而,我不能很容易地解释的是,为什么在Ruby 1.8.7中这似乎对您有效;在1.8.7和之前的版本中,忽略了数组#uniq的块参数。这个特性是在Ruby 1.9中添加的。也许你有一个补丁版本?这有点棘手
c = %w(a b c d)
1.8.7 :025 > c.uniq {|x|x[/^a/]}
=> ["a", "b"]
1.8.7 :026 > c.uniq {|x|x[/^b/]}
=> ["a", "b"]
1.8.7 :027 > c.uniq {|x|x[/^c/]}
=> ["a", "c"]
1.8.7 :029 > c.uniq {|x|x =~ [/^c/]}
=> ["a"]
1.8.7 :030 > c.uniq {|s|s[/[^abc]/]}
=> ["a", "d"]
此块中的x
是数组中的每个值。您可以通过“字符串是否以a
开头?”来定义唯一性。值a
是第一个计算为true
的值,因此是第一个值b
是第一个计算为false
的值,第二个值也是。c
和d
也计算为false
,但不是唯一的,因为已经找到了计算为false
的值
c = %w(a b c d)
1.8.7 :025 > c.uniq {|x|x[/^a/]}
=> ["a", "b"]
这里也是如此a
是第一个(false
),而b
是第二个(true
)
这里您可以看到a
是第一个false
值,c
是第一个评估为true
的值,因此是第二个唯一值
1.8.7 :027 > c.uniq {|x|x[/^c/]}
=> ["a", "c"]
这里,您通过“字符串是否匹配不匹配以c开头的字符串的正则表达式数组”定义了唯一性。奇怪
这里定义了一个字符类。您通过“包含a、b或c的字符串”定义了唯一性a
是第一个满足astrue
要求的d
是唯一计算为false
的值
希望这能有所帮助。这样看:当您对块使用
uniq
时,您可以有效地构建一个数组数组,其中每个内部数组都是[块的结果,数组元素]
,然后在第一个元素中查找唯一的值。因此,如果我们从以下方面开始:
1.8.7 :030 > c.uniq {|s|s[/[^abc]/]}
=> ["a", "d"]
看看
c = %w(a b c d)
然后数组的数组将如下所示:
c.uniq {|x|x[/^a/]}
在第一个元素中查找唯一值会产生'a'
和nil
:
[
['a', 'a'],
[nil, 'b'],
[nil, 'c'],
[nil, 'd']
]
而展开会产生['a','b']
。但是,不能保证您将获得作为第二个元素的'b'
您可以这样编写自己的uniq\u:
[
['a', 'a'],
[nil, 'b']
]
或者这个:
def uniq_by(a, &block)
Hash[a.map { |x| [ block.call(x), x] }].values
end
纠正我自己的细节:x[/^a/]
表示法意味着:在字符串x
中查找与/^a/
匹配的所有内容。如果是“a”
,它将匹配整个字符串(“a”
),如果是“b”
,它将计算为nil
。所以不是像我上面说的那样true
和false
,而是value
和nil
。非常有帮助而且解释清楚。你是对的。最后一个表达式也是如此。c、 uniq{s | s[/[^abc]/]}由“不包含a、b或c的字符串”定义uniq,因此a、b、c为零,d为d,则结果为['a','d']。否则,如果uniq被包含,那么结果将是['a','b','c','d'].@Race:Right。如果你做了c.uniq{s{124; s[/[abc]/]}
你会把整件事都拿回来,但是%w(abcde)。uniq{124; s{/[abc]/]}
可能会给你%w(abcdd)
回来。这是另一个理解的好方法。因为我们使用的方式是我们称之为“uniq_by”的方式,所以如果元素是散列或对象,我们应该通过散列值或散列键来实现唯一性。1.8.7:041>[{“a”=>“3”},{“a”=>“4”},{“a”=>“3”}).uniq{x}=>[{“a”=>“3”}]1.8.7:042>[{“a”=>“3”},{“a”=>“4”},{“a”=>“3”}.uniq{x{x}x.x.values=>“a”=>“3”}
[
['a', 'a'],
[nil, 'b']
]
def uniq_by(a, &block)
Hash[a.map { |x| [ block.call(x), x] }].values
end
def uniq_by(a, &block)
h = { }
a.each { |x| h[block.call(x)] = x ] }
h.values
end