#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"