Это немного сложно.
c = %w(a b c d)
1.8.7 :025 > c.uniq {|x|x[/^a/]}
=> ["a", "b"]
x
в этом блоке - каждое значение в массиве. Вы определяете уникальность как «строка начинается с a
?». Значение a
является первым, которое оценивается как true
, и, следовательно, является первым значением. b
является первым, чтобы оценить как false
, так и второе значение. И c
, и d
также оцениваются как false
, но не являются уникальными, так как значение, которое оценило false
, уже найдено.
1.8.7 :026 > c.uniq {|x|x[/^b/]}
=> ["a", "b"]
То же самое и здесь. a
является первым (false
) и b
вторым (true
).
1.8.7 :027 > c.uniq {|x|x[/^c/]}
=> ["a", "c"]
Здесь вы видите, что a
- это первое false
значение, а c
- первое значение, которое оценивается как true
и, следовательно, второе уникальное значение.
1.8.7 :029 > c.uniq {|x|x =~ [/^c/]}
=> ["a"]
Здесь вы определили уникальность как "соответствует ли строка массиву регулярных выражений, которые соответствуют строкам, не начинающимся с c". Weird!
1.8.7 :030 > c.uniq {|s|s[/[^abc]/]}
=> ["a", "d"]
Здесь вы определили класс персонажа. Вы определили уникальность с помощью «строк, содержащих a, b или c». a
является первым, чтобы удовлетворить как true
. d
является единственным значением для оценки как false
.
Надеюсь, это поможет.