Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
解释Ruby数组uniq方法的一个表达式_Ruby_Arrays_Uniq - Fatal编程技术网

解释Ruby数组uniq方法的一个表达式

解释Ruby数组uniq方法的一个表达式,ruby,arrays,uniq,Ruby,Arrays,Uniq,我理解正则表达式,我不理解uniq块是如何工作的 唯一性的确定基于将每个元素传递到块的结果 例如,第一个表示询问每个元素是否为“a”。第一个回答是肯定的,所以“a”被认为是独一无二的。第二个说不,所以“b”被认为是唯一的。其他人也说不,所以他们并不被认为是独一无二的(因为“不”的回答是我们已经看到的) 然而,我不能很容易地解释的是,为什么在Ruby 1.8.7中这似乎对您有效;在1.8.7和之前的版本中,忽略了数组#uniq的块参数。这个特性是在Ruby 1.9中添加的。也许你有一个补丁版本?这

我理解正则表达式,我不理解uniq块是如何工作的

唯一性的确定基于将每个元素传递到块的结果

例如,第一个表示询问每个元素是否为“a”。第一个回答是肯定的,所以“a”被认为是独一无二的。第二个说不,所以“b”被认为是唯一的。其他人也说不,所以他们并不被认为是独一无二的(因为“不”的回答是我们已经看到的)


然而,我不能很容易地解释的是,为什么在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
是第一个满足as
true
要求的
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