Monkeypatching is Destroying Ruby

Aqui:

http://www.guj.com.br/posts/list/45/83613

O método 'On <pagina> do {stuff}'faz um instance_eval. azendo isso ele perde o contexto do bloco describe do RSpec, perdendo então o acesso ao m’todo pending().Como pending e stateless a coisa foi resolvida fazendo o cara que implementa o método on() incluir o módulo que declara pending. Uma bela gambiarra :stuck_out_tongue:

louds, vc tá cheio de fans:

http://forum.rubyonbr.org/forums/1/topics/2783
http://forum.rubyonbr.org/forums/1/topics/2766

Oi, gente,

Eu tô discutindo lá no outro fórum e esse menino falou isso. Será que vocês podem me audar a responder ele? Sabe, ele fica me sacaneando e eu quero dar o troco…

[quote=pcalcado]Aqui:

http://www.guj.com.br/posts/list/45/83613.java#446292

O método 'On <pagina> do {stuff}'faz um instance_eval. azendo isso ele perde o contexto do bloco describe do RSpec, perdendo então o acesso ao m’todo pending().Como pending e stateless a coisa foi resolvida fazendo o cara que implementa o método on() incluir o módulo que declara pending. Uma bela gambiarra :stuck_out_tongue: [/quote]

Tá, agora entendi. Que tal algo do tipo:

module SeleniumOperations
  def search_for() ... end
  def filter_by() ... end
end

def on(pagina, &stuff)
  extend SeleniumOperations
  instance_eval(&stuff)
end

Isso não cria o escopo novo e acho que resolveria o seu problema. Só acho que não ataca o problema maior que eu ainda não consegui capturar de você! :wink:

Soluciona o problema porque você etá usando funções apenas, não objetos. Que tal:

class A
 def initialize
  @abc =122
 end

 def hehe
  B.new.huhuhu {p @abc; p bwawawawawa}
 end
end

class B
 def huhuhu(&block)
  instance_eval &block
 end

 def bwawawawawa
  'risada maquiavelica'
 end
end

A.new.hehehe

Eu quero que meu bloco tenha acesso ao escopo de B para poder usar o metodo bwawawawawa() mas ao mesmo tempo tenha acesso ao escopo original, para poder acessar @abc (ou um étodo que retorne abc, tanto faz).

Se não fosse por A ter estado eu poderia incluir B em A, o que seria gambiarra mas funcionaria e é o que fizemos com selenium. Este tipo de situação surge o tempo todo com internal DSLs.

Presta atenção nas respostas e perguntas aqui sendo feitas, e tenta aprender alguma coisa que não seja uma cegueira de falta do seu conhecimento, que já vem se passando despercebido.Outra coisa use mensagens privadas para falar sobre mim, isso é mais apropriado, é por isso que o GUJ tem esse recurso.Aqui o assunto é Ruby.
Outra coisa as pessoas sabem se representar, não precisam de segunda voz.
"Em relação a citar e sitar, pra um ignorante como você tudo passa ser uma coisa só "

Ainda bem que a “falta de conhecimento” do thingol “já vem se passando despercebido”, porque se alguém percebesse que ele não tem conhecimento em alguma coisa, de certo é algo que estava escondido nos confins do universo :stuck_out_tongue:

[quote=Maurício Linhares]
confins do universo :P[/quote]

Você bem que podia ficar lá, o assunto aqui é Ruby.

Ué, onde está essa mensagem que o Marcio Duran se referiu?

“Acho não caiu a ficha em você”

Márcio, por favor, não desvie o assunto do tópico. Se você tiver alguma coisa a acrescentar de útil a este tópico, por favor, faça-o. Caso contrário, evite postar mensagens fora do assunto central do tópico. Como você mesmo disse, existem mensagens privadas para isso. Assunto encerrado.

Peço a genteliza de passar essa mensagem aos demais que estão fazendo-o tamanha bossalidade e simplesmente vem de faixada aqui, e que não estão explorando o assunto.

Como disse questionei, o Louds por suas afirmações todavia as mesmas estão sendo questionadas aqui, não tomo partido por ninguem e eu espero que você faça o mesmo.

Att.
Marcio Duran

Voltando ao tópico.

Marcio Duran, o que você não entendeu mesmo ?
Tem tantas referencias ali que já não sei mais.

Sobre metaprogramação , resolução de nomes ?

[quote=nbluis]Voltando ao tópico.

Marcio Duran, o que você não entendeu mesmo ?
Tem tantas referencias ali que já não sei mais.

Sobre metaprogramação , resolução de nomes ?[/quote]

Veja a afirmação do Louds sobre Escopo…, não entendi…

[quote=pcalcado]

Eu quero que meu bloco tenha acesso ao escopo de B para poder usar o metodo bwawawawawa() mas ao mesmo tempo tenha acesso ao escopo original, para poder acessar @abc (ou um étodo que retorne abc, tanto faz).

Se não fosse por A ter estado eu poderia incluir B em A, o que seria gambiarra mas funcionaria e é o que fizemos com selenium. Este tipo de situação surge o tempo todo com DSLs.[/quote]

Uma dúvida, se você casar um par de instance eval/ module_eval para instancias de definem apenas os *_missing não é possivel capturar todos bindings?

[quote=Marcio Duran]
Veja a afirmação do Louds sobre Escopo…, não entendi…[/quote]

Isso é exatamente o que está sendo discutido no tópico.
Este tópico tem um assunto mais complexo do que se está acostumado por ai.

Falam sobre o escopo de blocos dentro de ruby. Veja os exemplos do shoes que estão bem esplicados.

E inclusive a impossibilidade de limitar escopo de alterações feitas no core da linguagem possibilitada pelas classes abertas.

O post do louds sobre monkeypatching ficou bem legal.
Dá uma lida alí.

[quote=pcalcado]Soluciona o problema porque você etá usando funções apenas, não objetos. Que tal:

class A
 def initialize
  @abc =122
 end

 def hehe
  B.new.huhuhu {p @abc; p bwawawawawa}
 end
end

class B
 def huhuhu(&block)
  instance_eval &block
 end

 def bwawawawawa
  'risada maquiavelica'
 end
end

A.new.hehehe

Eu quero que meu bloco tenha acesso ao escopo de B para poder usar o metodo bwawawawawa() mas ao mesmo tempo tenha acesso ao escopo original, para poder acessar @abc (ou um étodo que retorne abc, tanto faz).

Se não fosse por A ter estado eu poderia incluir B em A, o que seria gambiarra mas funcionaria e é o que fizemos com selenium. Este tipo de situação surge o tempo todo com DSLs.[/quote]

Emulemos então o binding hierárquico!

class A
  def pele
    &quot;aaabbbbccc&quot;
  end

  def hehe
    B.new.huhuhu(self) {p pele; p bwawawawawa}
  end
end  

class B  
  def huhuhu(parent_context, &block)
    (class &lt;&lt; self; self; end).send(:define_method, :method_missing) do |method, *args|
      parent_context.send(method, *args)
    end
    instance_eval &block
  end  

  def bwawawawawa  
    'risada maquiavelica'  
  end  
end  

A.new.hehe

Agoro Ruby, e adoro metaprogramação! :twisted:

Você tá simulando herança aqui, não binding hierárquico.

[quote=louds]

Você tá simulando herança aqui, não binding hierárquico.[/quote]

Isso é bastante usado em javascript para fornecer herança.

Prototype é um exemplo disso.

Bom, vou voltar aqui que a poeira abaixou, e vou fazer minhas declarações:

  • Eu não sei Ruby;
  • Entretanto, eu sei o que é metaprogramação e problemas de scoping e outros quetais;
  • E vou fazer minha digressão aqui.

Há dois tipos de programadores: os “blue-collars” e os “white-collars”. *
O sr. Gosling tinha afirmado uma vez que Java era para os programadores “blue-collar”, ou seja, aqueles caras que antigamente se matavam para fazer os programas em C++ funcionarem, e agora se matam para fazer os programadores Java funcionarem no mundo real - deploys, web services e outras chateações. Eles não têm muitas idéias de conceitos abstratos, e é uma vitória que eles finalmente consigam entender corretamente o conceito de orientação a objeto, que levou muitas décadas para ser aceito.
Os “white-collars” são aqueles que entendem todos esses conceitos e criam novos, ou pelo menos têm a coragem de irem além desses conceitos. Programação funcional ou genérica para eles é o seu café da manhã, e é coisa muito antiga para eles - afinal de contas, quantos 50 anos tem a linguagem Lisp? Normalmente são os que falam de assuntos “esotéricos”.

O sr. Marcio Duran (um clássico “blue-collar” - eles é que fazem o mundo girar) entrou no meio de uma discussão de “white-collars” e esperou tentar entender alguma coisa rapidamente**, só que não percebeu que “entrou na sala errada” e exigiu ser tratado como um igual. Aí é que ocorreu o problema.


  • Não estou usando aqui “white-collar” no sentido em que se dá nas editorias de política, que tratam de muitos “crimes de colarinho branco”. Nada disso :stuck_out_tongue: - uso em contraposição a “blue-collar”, que é o colarinho de um macacão azul de um operário de fábrica.
    ** Como bom “blue-collar”, ele não tem tempo de tentar entender essas coisas “esotéricas” e acha tudo uma grande besteira.