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
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…
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 [/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ê!
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
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.
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=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
"aaabbbbccc"
end
def hehe
B.new.huhuhu(self) {p pele; p bwawawawawa}
end
end
class B
def huhuhu(parent_context, &block)
(class << 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
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 - 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.