Как заставить функцию принимать блок

#ruby

#ruby

Вопрос:

У меня есть класс G и моя пользовательская функция func, которую я ожидаю использовать для такого блока:

 class G
def func(amp;block)
return '1' unless block_given?
# More code
end
end
 

Я думаю, что теперь, когда я делаю

 G g = new G
g.func {|t| t}
 

block_given? должен возвращать true, но возвращать false

Я также пробовал следующие варианты, чтобы не прибегать

 g.func do |t|
end
 

Любая помощь будет оценена.

Комментарии:

1. Для меня работает нормально, хотя я не уверен, на каком языке написан ваш тестовый блок — в Ruby это было бы g = G.new .

2. Дэйв, да, я тоже. Я думаю, что это какое-то недоразумение из-за использования «если» вместо «если».

Ответ №1:

Она работает нормально, если вы исправите некоторые незначительные синтаксические ошибки. Обратите внимание, что для переменных ruby нет объявления типа, а создание экземпляра объекта выполняется с помощью метода экземпляра класса Class , а не с помощью ключевого слова (как в Java):

 class G
  def func(amp;block)
    return '1' unless block_given?
    block.call
  end
end

g = G.new
g.func { puts 'block was called' }
g.func
# Output:
# irb(main):046:0>g.func { puts 'block was called' }
# block was called
# => nil
# irb(main):047:0>g.func
# => "1"
 

Комментарии:

1. Незначительная придирка: new на самом деле является методом экземпляра класса Class . ruby-doc.org/core-1.9.2/Class.html#method-i-new (значение G.new — это не метод класса G , а метод экземпляра экземпляра G класса Class ).

2. Поскольку мы все равно придираемся: в Ruby нет такого понятия, как метод класса . Методы класса — это просто одноэлементные методы объекта класса. О, подождите, такого понятия, как одноэлементный метод , тоже не существует 🙂 Одноэлементные методы — это просто обычные старые скучные методы экземпляра одноэлементного класса.

Ответ №2:

(Добавляю свой вывод, хотя Мэтт опередил меня в этом.)

 > class G
>   def func(amp;block)
>     return '1' unless block_given?
>     # More code
>   end
> end
=> nil 
> g = G.new
=> #<G:0x856e444> 
> g.func { |t| puts "hi" }
=> nil 
> g.func
=> "1"