Реальное использование связующих объектов в ruby - PullRequest
5 голосов
/ 22 октября 2009

Прошлой ночью я размышлял о том, что я считаю продвинутыми функциями языка руби, а именно объектами Continuations (callcc) и Binding. Я имею в виду продвинутый, потому что у меня есть статический тип языка oo langages (C #, Java, C ++), я недавно открыл для себя ruby, поэтому эти возможности языка мне не очень знакомы.

Мне интересно, что может быть в действительности использование этих возможностей языка. По моему опыту, все может быть сделано с помощью статически типизированных языков, но иногда я согласен не очень умно. Я думаю, что я понял красоту / интерес продолжения, читая эту прекрасную статью от Сэма Руби: http://www.intertwingly.net/blog/2005/04/13/Continuations-for-Curmudgeons

Тем не менее, я потерян с привязывающим объектом. Может ли кто-нибудь предоставить мне некоторые реальные примеры того, что можно сделать с помощью объекта Binding, но не очень умно, если в языке отсутствует концепция рубинового Binding?

Я думал о том, чтобы откатить некоторые объекты до их начального состояния, когда что-то пойдет не так во время длительного процесса, но я не уверен, что это может быть реализовано с помощью объекта Binding, и я думаю, что это может быть реализовано довольно разумно путем клонирования объектов до обработка и замена измененного объекта их клонами, когда что-то идет не так во время обработки. Так что это не правильный пример, я думаю.

Заранее спасибо за помощь.

Ответы [ 3 ]

8 голосов
/ 22 октября 2009

Связывающие объекты полезны, когда вы хотите оценить Шаблоны ERB.

5 голосов
/ 27 октября 2009

Я использовал класс привязки для реализации хака отладки.

class Array
  def debug binding
    each do |arg|
      puts "arg = #{eval(arg, binding).inspect}"
    end
  end
end

Вы можете использовать это для проверки списка фрагментов кода Ruby вместе с тем, что возвращает каждый фрагмент:

# .. some hairy code you want to debug ...
['user','current_resource', 'user.owns?(current_resource)'].debug(binding)

, который будет печатать

user = #<User id:1, username: 'joe', ...
current_resource = #<Comment id:20, ...
user.owns?(current_resource) = false

Я считаю, что это очень полезно для быстрой отладки.

Мне нужно было использовать объект привязки для захвата области, где вызывается debug, чтобы его можно было использовать в eval при запуске debug. Возможно, есть и другие способы реализовать это, но использование привязки было простым и быстрым. Есть также, вероятно, гораздо лучшие примеры того, для чего полезны объекты привязки ...

1 голос
/ 27 октября 2009

Взгляните на http://www.seaside.st/, это фреймворк для небольших веб-приложений. Он широко использует продолжения. Лучший пример из реальной жизни о том, как его использовать, это CMS http://www.cmsbox.com/en/cms

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