Problemi con Proc

Ciao a todos…
allora, vi posto il codice sul quale ho versato il mio sudore nelle
ultime due ore prima di capire che forse ho bisogno di una mano :wink:

quello che mi serve è un metodo di classe che prenda come parametri il
nome(un simbolo) di un metodo, ed un blocco con il quale estendere il
metodo stesso.

sembrava facile, ma non riesco a passare il blocco dal metodo di classe
al metodo di istanza… vabbè, guardatevi il codice che è più semplice…

grazie a chi ci si metterà…

class Prova def Prova.estendi_metodo method, &block
class_eval(<<-EXTENSION alias bb_#{method} #{method} def #{method}
bb_#{method} do|aa| #qui invece di questo fittizio, ci andrebbe quello
passato comew parametro puts aa+‘ciaooo’ end end
EXTENSION )
end def ciccio if block_given? yield ‘extended’ else
puts ‘classic’ end end Prova.estendi_metodo :ciccio do|item| puts
‘esteso’ end end
Prova.new.ciccio

Il 28/06/07, Giuliano U. [email protected] ha scritto:

Ciao a todos…
allora, vi posto il codice sul quale ho versato il mio sudore nelle ultime
due ore prima di capire che forse ho bisogno di una mano :wink:

Premesso che non ho capito bene lo scopo e per quale motivo tu abbia
bisogno
di questa funzionalità, e che quindi potrei non aver interpretato
correttamente le specifiche, ho provato a scrivere una soluzione.
Per utilizzarla basta chiamare:
class Pippo
extend ExtendMethod

extend_method :pippo do |param|
puts param
end
end

Ovviamente potrebbe non funzionare, non l’ho testata adeguatamente, i
test
che ho fatto sono inclusi. :slight_smile:

#! /usr/bin/ruby

module ExtendMethod
def blocks
@blocks ||= {}
end

def extend_method(name,new_name=nil,&block)
if new_name.nil?
alias_name = “ext_”+name.to_s
class_eval “alias :#{alias_name} :#{name}”
new_name = name.to_sym
name = alias_name.to_sym
end

blocks[new_name] = block
ext = <<-EXTENSION
  def #{new_name}
    #{name}(&self.class.blocks[:#{new_name}])
  end
EXTENSION

class_eval(ext)

end
end

-----> Specs

require ‘rubygems’
require ‘spec’

describe “A Class extending ExtendMethod” do

before :each do
@class = Class.new
method =<<-METHOD
def method
yield “Hello”
end
METHOD
@class.send(:class_eval,method)
@class.send(:extend,ExtendMethod)
@instance = @class.new
end

it “should be able to extend method adding blocks” do
extension =<<-EXTENSION
extend_method(:method, :new_method) do |param|
param + " World"
end
EXTENSION

@class.send(:class_eval,extension)
@instance.should respond_to(:new_method)
@instance.new_method.should == "Hello World"

end

it “should be able to extend without renaming” do
extension =<<-EXTENSION
extend_method(:method) do |param|
param + " World"
end
EXTENSION

@class.send(:class_eval,extension)
@instance.method.should == "Hello World"

end
end