Pergunta

Na noite passada, eu estava pensando sobre o que eu acho que são características linguagem Ruby avançados, nomeadamente Continuations (callcc) e objetos de ligação. Quero dizer avançou porque eu tenho um estaticamente digitado oo langages fundo (C #, Java, C ++), descobri rubi muito recentemente, pelo que estes recursos de linguagem não são muito familiar para mim.

Eu estou querendo saber o que poderia ser uso no mundo real desses recursos Langages. Na minha experiência, tudo o que poderia ser feito com langages oo de tipagem estática, mas eu não concordo muito esperta às vezes. Eu acho que eu descobri a beleza / interesse da leitura Continuação que belo artigo de Sam Ruby: http://www.intertwingly.net/blog/2005/04/13/Continuations-for-Curmudgeons

Ainda assim, estou perdido com objeto Binding. Alguém pode me fornecer alguns exemplos do mundo real de algo que pode ser inteligentemente feito com Binding objeto, mas não muito esperta com langages falta o conceito de rubi Encadernação?

Eu estava pensando em rollbacking alguns objetos ao seu estado inicial quando algo der errado durante um processo longo runing, mas não tenho certeza de que isso poderia ser implementado com objeto Binding e eu acho que poderia ser implementada bastante esperta clonando objectos antes do processamento e substituindo objeto modificado com seus clones quando algo dá errado durante o processamento. Portanto, este não é um exemplo válido eu acho.

Agradecemos antecipadamente a sua ajuda.

Foi útil?

Solução

Eu usei a classe de ligação para implementar um hack depuração.

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

Você pode usar isso para inspecionar uma lista de trechos de código Ruby, juntamente com o que cada trecho de retorno:

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

que irá imprimir

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

Acho que é muito útil para depuração rápida.

Eu precisava usar um objeto de ligação para capturar o escopo onde debug é chamado para que ele possa ser usado na eval quando debug é executado. Há provavelmente outras maneiras de ter implementado este mas usando a ligação foi fácil e rápido. Há também são provavelmente muito melhores exemplos do que objetos de ligação são úteis para ...

Outras dicas

objetos Binding são úteis quando você quer avaliar ERB modelos.

Dê uma olhada http://www.seaside.st/ , é uma aplicação web smalltalk estrutura. Ele usa continuações extensivamente. Melhor exemplo do mundo real sobre como usá-lo, é este CMS http://www.cmsbox.com/en / cms

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top