2016-09-08 15 views
2

の解釈:これらの3つのそれぞれにおいてRubyは間違って、私は次のコードのようなコード持っているクラスの名前空間

require_relative 'class/foo' 
require_relative 'class/bar' 
require_relative 'class/baz' 

class MyClass 
    def initialize(arg) 
    ... 

    %w(wordone wordtwo).each do |word| 
     Foo.public_send(word.to_sym, arg) 
     Bar.public_send(word.to_sym, arg) 
     Baz.public_send(word.to_sym, arg) 
    end 
    end 
end 

が必要です。このテンプレートのようなコード:これはFooために完全に正常に動作

class Foo 
    def self.wordone(arg) 
    # do stuff 
    end 

    def self.wordtwo(arg) 
    # do stuff 
    end 
end 

そしてBarが、一度ヒットしたらBaz

NameError: uninitialized constant MyClass::Baz 
Did you mean? Baz 

明確にBazを指定し、MyClass::Bazを指定しません。なぜRubyは最初の2つではなく、3番目のオブジェクトメソッド呼び出しの名前空間をランダムに誤って解釈していますか?

私も、私が変更した場合ことを言及する必要がありますに

Baz.public_send(word.to_sym, arg) 

Baz.wordone(arg) 

それはその1つのメソッド呼び出しのために完璧に動作しますが、私は明らかにするために、複数のメソッド呼び出しをループする必要がありますそのクラス。したがって、Rubyの名前空間の誤解は、オブジェクトメソッドでpublic_sendの使用にリンクされているようです。

これはRuby 2.3.1p112で発生しています。

+0

ええ、おそらく、あなたのクラス 'クラス'を呼び出さないでください。 :-) – mwp

+0

@mwpスニペットをClass以外のものに編集することができます。私はあまりにも私が推測する書式を変更する必要があります。 –

+2

生殖可能な完全な例を教えてください。私のクリスタルボールが壊れています。 – Nax

答えて

1

を行く方法を見てみましょう、ということをチェックできます。基本的には何がここで起こって

はRubyがでクラスBazを見つけることができないですそれはMyClassの下にあります(最初はMyClassの下を見てから、最上位レベルをチェックします;エラーメッセージはどちらの名前空間でも見つかりません)。

1

いくつかの文字が

$('wordone wordtwo').each {|word| p word}

エスケープ余分を削除

"\"wordone\"""\"wordtwo\""

を与え、検査の際にブロック

に渡された文字列にエスケープされているようです文字列引用符とフォワードスラッシュはそれを働かせますfそれともわたし。

class MyClass 
    def initialize(arg) 
    ... 

    %w(wordone wordtwo).each do |word| 
     word = word.tr('\"', ''); 
     Foo.public_send(word.to_sym, arg) 
     Bar.public_send(word.to_sym, arg) 
     Baz.public_send(word.to_sym, arg) 
    end 
    end 
end 

あなたはのは、それがOPからの私の(明らかに役に立つ)コメント体系化

+0

申し訳ありませんが、同じ問題。私はRubyにバグを発見したようで、ハックリで回避するか報告するかを判断する必要があります。 –

+0

ああ。 。 。さて、私たちは試しました。報告してください。私は間違いなくそれを奨励したい:) – Cent

関連する問題