0

私はルビーに不慣れです。簡単なメソッド(パラメーター付き)の呼び出しを試みました。

class MeowEncoder
    def method(c)
        puts c
        end
    end

print "please enter the thing you want"
s = gets.chomp()
MeowEncoder.method(s)

パラメータを渡して出力するだけです。しかし、ターミナルは私に次のようなエラーを出し続けます

:MeowEncoder.rb:9: undefined method `toBinary' for MeowEncoder:Class (NoMethodError)

ここで何が起こっているのですか?

いくつかの機能強化を行いました。

class MeowEncoder
        def encode(n)
            toBianry(?n)
            puts ""
        end

        def toBinary(n)
            if n < 2
                print n
            else
                toBinary(n / 2)
                print n % 2
            end
        end
    end

    o = MeowEncoder.new


    print "please enter the thing you want: "
    s = gets.chomp()
    s.each_char{|c| o.encode(c)} #this doesn't work
    o.toBinary(212)  # this works

ここでいくつかの機能強化を行いました。charをASCII値に変換してから、バイナリ形式に変換しようとしています。単一のtoBinary作品を作ることができます。しかし、Encodeメソッドでも同じエラーが発生しました。どうしたの?

4

4 に答える 4

5

インスタンスメソッドを定義しましたが、クラスオブジェクトで呼び出そうとしています。これを試して:

MeowEncoder.new.method(s)

また、methodはメソッドの悪い名前です。名前の衝突が発生します。

于 2013-01-29T18:20:19.783 に答える
2

セルジオの答えを拡張するには、実際にクラスで定義されたメソッドが必要な場合は、それを達成する方法がいくつかありますが、最も簡単なのは、メソッド定義の先頭に次のselfように追加することです。

def self.method(c)
  puts c
end

これにより、現在の方法でメソッドを呼び出すことができます。

これが機能する理由は、メソッドを定義するコンテキストで、クラスselfに設定されるためです。MeowEncoder次のように言うのと同じです:

def MeowEncoder.method(c)
  puts c
end

これは、実際にはクラス メソッドを宣言するもう 1 つの有効な方法ですがself、クラスの名前を変更した場合にリファクタリングが容易になるため、使用することをお勧めします。

于 2013-01-29T18:44:37.973 に答える
0

each_charの代わりにeach_byteを使用し、encode メソッドは必要ありません。

s.each_byte{|c| o.toBinary(c)}
于 2013-01-29T18:54:39.350 に答える