2016-10-31 12 views
0

define_singleton_methodブロック内のクラスメソッドにアクセスしようとしていますが、動作していないようです。Rubyのdefine_singleton_methodブロックのクラスメソッドにアクセスするには

ここは例です。

class Test 
    attr_accessor :tags 

    def initialize 
    @tags = [] 
    @tags.define_singleton_method(:<<) do |val| 
     val = tosymbol(val) 
     push(val) 
    end 
    end 

    def tosymbol(value) 
    value = value.to_s 
    value = value.gsub!(/\s+/,'_') || value 
    value = value.downcase! || value 

    return value.to_sym 
    end 
end 

しかし、私はそれを使用するときにエラーが発生します。

test = Test.new 
test.tags<<"Hello World" 
NoMethodError: undefined method `tosymbol' for []:Array 
    from /home/joebloggs/GitHub/repo/file.rb:183:in `block in initialize' 
    from (irb):9 
    from /home/joebloggs/.rvm/rubies/ruby-2.3.0/bin/irb:11:in `<main>' 

私はval = Test::tosymbol(val)val = tosymbol(val)を変更しようとしたが、それはどちらか動作しませんでした、私はtosymbolが何をしているかを再記述することもできますが、それは非常にDRYではないでしょうundefined method 'tosymbol' for Test:Class

を取得します。どこが間違っていますか?ありがとう。

+0

デフself.tosymbol' '試してみてくださいは、その後、' 'テスト:: tosymbol(val)で呼び出します。実際に何をしようとしていますか?多分もっと良い方法を提案するかもしれません。 –

+0

'def self.tosymbol'は残念なことに動作しませんでした。私がしたいことは、インスタンス変数にプッシュされたものに対して検証メソッドを実行することです。現時点では、インスタンスの<<メソッドをオーバーライドすることでこれを実行しようとしています。問題は、私が他の場所にあるコードを再利用したいということです。 'define_singleton_method'は、それ以外のものを見ることができないようです。 –

答えて

2

どこが間違っていますか?

あなたはArrayクラスのインスタンスの<<方法、ないTestクラスを定義する(再)です。

tosymbolメソッドにアクセスしようとしていますが、それはArrayクラスではなく、Testクラスに定義されています。

何がしたい、はおそらくは、あなたのコードサンプルから判断読み)、Testクラスのインスタンスに対して<<方法を定義することである:あなたの例のようにするに

def initialize 
    @tags = [] 
end 

def <<(val) 
    tags << tosymbol(val) 
end 

test = Test.new 
test << "Hello World" 
#=> [:hello_world] 

EDIT

インスタンスを変数に代入し、正しい受信者でtosymbolメソッドを呼び出す必要があります:

test.tags << 'Hello World' 
#=> [:hello_world] 
+0

申し訳ありませんが、これは私のために働いていません。 '<<'タグは、通常は配列の場合と同様に動作し、 'def <<(val)'メソッドの何も起こっていません(置く)。 –

+0

@I_do_python申し訳ありませんが、私は答えを編集しました。それはちょうど 'test <<" Hello World "' –

+0

になっています。しかし、これはインスタンス変数に固有のものにするためにとにかくありますか?これはおそらくクラス内に単一の配列インスタンス変数しか持てないことを意味します。タグ変数への追加(つまり、 'test << 4'の結果は' test.tags'の下にあります)もユーザにはっきりしていません。 –

関連する問題