2010-02-05 6 views
0

Je suis en train de faire une méthode similaire à attr_reader, mais je ne peux pas sembler obtenir l'instance de la classe que la méthode est appelée à.méthodes similaires à Ruby attr_reader

class Module 
    def modifiable_reader(*symbols) 
    # Right here is where it returns Klass instead of #<Klass:0x1df25e0 @readable="this"> 
    mod = self 

    variables = symbols.collect { |sym| ("@" << sym.to_s).to_sym } 
    attr_reader *symbols 

    (class << ModifyMethods; self; end).instance_eval do 
     define_method(*symbols) do 
     mod.instance_variable_get(*variables) 
     end 
    end 
    end 
end 

class Object 
    module ModifyMethods; end 
    def modify(&block) 
    ModifyMethods.instance_eval(&block) 
    end 
end 
class Klass 
    modifiable_reader :readable 

    def initialize 
    @readable = "this" 
    end 
end 

my_klass = Klass.new 
my_klass.modify do 
    puts "Readable: " << readable.to_s 
end 

Répondre

1

Je ne suis pas sûr de ce que vous essayez de faire.

Si elle aide, le sort de attr_reader est quelque chose comme ceci:

#!/usr/bin/ruby1.8 

module Kernel 

    def my_attr_reader(symbol) 
    eval <<-EOS 
     def #{symbol} 
     @#{symbol} 
     end 
    EOS 
    end 

end 

class Foo 

    my_attr_reader :foo 

    def initialize 
    @foo = 'foo' 
    end 

end 

p Foo.new.foo  # => "foo" 
1

Ce que je comprends de votre code est que vous voulez avoir le bloc modify pour répondre aux méthodes d'instance de Klass, c'est aussi simple que:

class Klass 
    attr_reader :modifiable 
    alias_method :modify, :instance_eval 

    def initialize(m) 
    @modifiable = m 
    end 

end 

Klass.new('john').modify do 
    puts 'Readable %s' % modifiable 
end 

A propos de cette friandise de code:

def modifiable_reader(*symbols) 
    # Right here is where it returns Klass instead of #<Klass:0x1df25e0 @readable="this"> 
    mod = self 
    ... 

Probablement cela peut vous donner une idée de ce qui se passe:

Class.superclass # => Module 
Klass.instance_of?(Class) # => true 

Klass = Class.new do 
    def hello 
    'hello' 
    end 
end 
Klass.new.hello # => 'hello' 

Lorsque vous ajoutez des méthodes à la classe Module, vous aussi ajouter des méthodes à la classe Class, qui ajoutera une méthode d'instance aux instances de Class (dans ce cas, votre classe Klass), à la fin cela signifie que vous ajoutez des méthodes de classe sur votre Klass classe

Questions connexes