побитовый рубин или - PullRequest
       2

побитовый рубин или

0 голосов
/ 02 августа 2010

Вот код

def tmp

  a = ancestors.first(ancestors.index(ActiveRecord::Base))

  b = a.sum([]) { |m| m.public_instance_methods(false) | 
                  m.private_instance_methods(false) | 
                  m.protected_instance_methods(false) }

  b.map {|m| m.to_s }.to_set

end

Я думал |является побитовым оператором ИЛИ.Так почему же b содержит не булевы значения?

1 Ответ

4 голосов
/ 02 августа 2010

Было бы полезно, если бы вы сказали, что должен делать ваш код, но, думаю, я наконец-то понял.|, который у вас есть, вовсе не является ИЛИ, ни побитовым, ни логическим.Это операция объединения массивов.Ищите это под Array rubydoc.Он принимает аргументы Array и выдает результат Array, состоящий из всех элементов любого массива.

Поскольку почти все в Ruby является объектом (кроме блоков, здесь не релевантных), абсолютных операторов нет«кроме простого назначения.Каждый оператор на самом деле является методом, определенным в некотором классе и, следовательно, контекстным.

Кроме того, как кто-то правильно указал (удален сейчас), побитовое ИЛИ имеет дело с целыми числами, а не с логическими значениями: 7 | 12 == 15.Логический или || имеет дело с булевыми значениями, но он также может возвращать не булевы значения, поскольку строго говоря все, кроме nil и false, является истинным.Таким образом, 7 || 12 возвращает 7, а не true (что по-прежнему эквивалентно истине в большинстве контекстов).

ОБНОВЛЕНИЕ: Я упустил из виду тот факт, что ||и &&, когда он используется в булевом объекте, фактически не может быть определен в Ruby из-за их семантики короткого замыкания.Тем не менее это не меняет того факта, что они ведут себя как булевы методы.

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