Перепишите простую рубиновую функцию, чтобы использовать блок - PullRequest
9 голосов
/ 11 февраля 2010

Я не знаю правильной терминологии. Я пытался гуглить, но по этой причине ничего не смог найти.

Я пишу библиотеку Ruby и хочу переписать функции, чтобы они работали, как показано ниже, так как я предпочитаю это для удобства чтения (внутри блока?)

У меня есть функция, которая делает это

@dwg = Dwg.new("test.dwg")
@dwg.line([0,0,0],[1,1,0])
@dwg.save

Я хочу переписать его, чтобы он работал так

Dwg.new("test.dwg") do

   line([0,0,0],[1,1,0])
   save

end

Можете ли вы описать, как я это делаю?

1 Ответ

15 голосов
/ 11 февраля 2010

Вы можете определить инициализатор Dwg для получения блока, а затем уступить этому блоку с помощью instance_eval, например:

class MyClass
  def initialize(name, &block)
    @name = name
    instance_eval &block
  end

  def show_name
    puts 'My name is ' + @name
  end
end

MyClass.new('mud') do
  show_name
end

# >> My name is mud

Для получения дополнительной информации см. Раздел «Блоки для упрощения интерфейса» в недавно лицензированной Creative-Commons главе 2 превосходной Ruby Best Practices книги Грегори Брауна. (Его автор и издатель постепенно копируют все это, но вы, конечно, можете купить копию, чтобы поддержать работу. Издание для iPhone особенно доступно.)

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