ruby &: синтаксис метода - PullRequest
4 голосов
/ 09 марта 2011

Я столкнулся с ошибкой, когда я пропустил пробел, как это

@entries = [#<Entry id: 3806, approved: false, submitted: false]

@entries.any?&:submitted? => true
@entries.any? &:submitted? => false

как пространство меняет поведение. Entry.submitted? => false для всех элементов в массиве, вторая строка имеет желаемое поведение.

1 Ответ

18 голосов
/ 09 марта 2011

Проблема в том, что & также является унарным оператором, который имеет приоритет.

Когда вы делаете это:

@entries.any?&:submitted?

Вы на самом деле делаете это:

(@entries.any?)&(:submitted?)

Что приводит к истине. Так как в @entries есть записи и символ: представлены? имеет истинное значение истины.

Когда вы делаете это:

@entries.any? &:submitted?

Что вы на самом деле делаете, это:

@entries.any?(&:submitted?)

Что вы действительно хотите.

Причина, по которой @pilcrow заставил его работать, заключается в том, что он / она использовал следующий класс:

class Entry
  def submitted?
    true
  end
end

Чтобы воспроизвести результат, используйте следующий класс:

class Entry
  def submitted?
    false
  end
end

P.S: То же самое с примером @ fl00r:

[1,2,nil].any?&:nil? and [1,2,nil].any? &:nil?

[1,2, ноль] .any? приводит к истине и: ноль? имеет истинное значение true, поэтому результаты совпадают, так как [1,2, nil] также содержит нулевое значение, но вычисления отличаются.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...