Как я могу проверить, пустой ли блок? - PullRequest
8 голосов
/ 05 августа 2011

У меня есть блок кода, и я хотел бы проверить, является ли тело пустым, без запуска кода внутри блока. Это возможно?

Ответы [ 2 ]

9 голосов
/ 05 августа 2011

Драгоценный камень sourcify добавляет метод Proc#to_source:

>> require 'sourcify'
=> true
>> p = Proc.new {}
=> #<Proc:0x000001028490b0@(irb):3>
>> p.to_source
=> "proc { }"

Когда у вас есть блок в виде строки, довольно легко увидеть, есть ли отметка (или только пробел) между фигурными скобками.

7 голосов
/ 05 августа 2011

Обновление : сравнение удаленных блоков в Ruby 2.0+ невозможно, поэтому использование встроенных методов невозможно.

Руби раньше сравнивал Proc с, но был не очень хорош в этом . Например, вы могли бы:

def is_trivial_block?(&block)
  block == Proc.new{}
end

is_trivial_block?{} # => true
is_trivial_block?{ 42 } # => false
# but caution:
is_trivial_block?{|foo|} # => false

Из-за этого было решено убрать сравнение блоков, поэтому два блока теперь ==, если они являются одним и тем же объектом.

...