# Problemi con Proc

**URL:** <https://www.ruby-forum.com/t/problemi-con-proc/108015>\
**Category:** IT\
**Created:** [June 28, 2007, 1:43pm UTC](https://www.ruby-forum.com/t/problemi-con-proc/108015 "2007-06-28T13:43:13Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![Giuliano\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/ecd19e/32.png) [@Giuliano\_U](https://www.ruby-forum.com/u/Giuliano_U)\
**Post date:** [June 28, 2007, 1:43pm UTC](https://www.ruby-forum.com/t/problemi-con-proc/108015/1 "2007-06-28T13:43:13Z")

</div>

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 😉

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

---

<div class="post-metadata">

**Author:** ![Giuliano\_U](https://www.ruby-forum.com/letter_avatar_proxy/v4/letter/g/ecd19e/32.png) [@Giuliano\_U](https://www.ruby-forum.com/u/Giuliano_U)\
**Post date:** [June 28, 2007, 5:01pm UTC](https://www.ruby-forum.com/t/problemi-con-proc/108015/2 "2007-06-28T17:01:46Z")

</div>

Il 28/06/07, Giuliano U. [removed\_email\_address@domain.invalid](mailto:removed_email_address@domain.invalid) 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 😉

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. 🙂

#! /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
