1

私はこれが以前に機能していたと確信しています!

次のクラスがあります。タイトル文字列はクラス内に作成され、fname文字列とlname文字列がパラメータとして渡されます。ただし、@titleオブジェクトがnil以外のものを返すようにすることはできないようです。

私はここで何が間違っているのですか?

class Person
  attr_accessor :fname, :lname, :title

  def initialize(fname, lname)
    @fname = fname
    @lname = lname
    @title = title
  end

  def string1
    @lname + ", " + @fname
  end

  @title = "Director"

  def string2
    @title
  end

end

p = Person.new("Yukihiro", "Matsumoto")

p p.string1
p p.string2
4

3 に答える 3

2

クラスのコンテキスト内で@title、クラスインスタンス変数を参照します。インスタンスメソッドのコンテキスト内で、@titleインスタンス変数を参照します。あなたはこれら2つを混同しています。

代わりに必要なのは、適用する必要のあるデフォルトの種類がある場合の遅延初期化子です。

def title
  @title ||= "Director"
end

または、そもそもそれを実装することをお勧めします。これを修正する1つの方法は、initializeメソッドを拡張することです。

def initialize(fname, lname, title = nil)
  @fname = fname
  @lname = lname
  @title = title || "Director"
end
于 2013-01-08T16:50:16.770 に答える
1

titleコンストラクターに渡していない。あなたはの線に沿って何かを持っている必要があります

def initialize(fname, lname, title)
    @fname = fname
    @lname = lname
    @title = title
end

そしてそれを

p = Person.new("Yukihiro", "Matsumoto", "sensei")

この行は、クラスのインスタンスの構築中ではなく@title = "Director"、クラス自体に変数を設定するクラス定義中に実行されます。そのため、作成する新しいオブジェクトでインスタンス変数が「Director」に設定されていません。と。Person@titlePerson.new

実際、これが起こっていることを示す方法は次のとおりです。このメソッドを追加する

class Person
    def self.string3
        @title
    end
end

Personクラス定義中に設定されたクラスのインスタンス変数を取得するためのクラスメソッドを追加します。

>> p Person.string3
"Director"
于 2013-01-08T16:47:41.753 に答える
1

次のコード:

class Person
  attr_accessor :fname, :lname

  def initialize(fname, lname)
    @fname = fname
    @lname = lname
  end

  def string1
    @lname + ", " + @fname
  end

  def title
    @@title
  end

  @@title = "Director"

  def string2
    @@title
  end

end

p = Person.new("Yukihiro", "Matsumoto")

p p.string1
p p.string2

Ruby 1.9.3で実行すると、次の出力が得られます。

"Matsumoto, Yukihiro"
"Director"

作成するすべてのオブジェクトのタイトルを同じに保ちたいと思います。そうでない場合、iamnotmaynardの答えはあなたが求めているものです。

于 2013-01-08T16:51:04.757 に答える