0

次の単純なクラスを作成しました:

class Test
  def initialize(a, b)
    @a = a
    @b = b
  end

  def test
    puts @a
  end
end

に置き換える方法は@aありselfますか?これをやろうとするたびに、エラーが発生しました:

undefined method `a'

これを行っている理由は、2 つのパラメーターを持つ新しいオブジェクトを作成し、後でこれらのパラメーターを次のように操作したいからです。

d = MyObject('title', 'Author')
d.showAuthor
4

6 に答える 6

5
class Test
  attr_accessor :a,:b   #creates methods a,b,a=,b= and @a and @b variables

  def initialize(a, b)
    self.a = a  #calls a=
    self.b = b  #calls b=
  end

  def test
    puts a  #calls method a; self.a would do the same.
  end

  def self.[](a,b)
    new(a,b)
  end
end

これにより、新しいものを削除できます(ただし、括弧を角括弧に変更する必要があります)。したがって、次のように呼び出すことができます。

d=Test['dog','cat']
d.a  #'dog'
于 2013-07-19T22:12:55.213 に答える
1

アクセサーを定義する必要があります。次を使用して実行できますattr_*

class Foo
  attr_accessor :a,:b

  def initialize(a, b)
    self.a = a
    self.b = b
  end
end

camelCaseまた、Ruby では使用しないでください。命名規則があります。

  • 変数 -snake_case
  • メソッド -snake_case
  • クラス -CapitalCamelCase
  • 定数 -CAPITAL_SNAKE_CASE
于 2013-07-19T21:32:00.160 に答える
1

を使用すると、Ruby はで表されるクラスself.aのメソッドを探しているため、undefined method エラーが発生します ( というメソッドを定義していないため)。あなたはおそらく探している:aselfa

class Test
  attr_accessor :a, :b

  def initialize(a, b)
    self.a = a
    self.b = b
  end

  def test
    puts self.a   # "puts a" would be adequate here since it's not ambiguous
  end
end
于 2013-07-19T21:32:45.113 に答える
1

インスタンスの外部からインスタンス変数にアクセスする必要がありますか? attr_accessor を使用してそれを行うことができます:

class Test
  attr_accessor :a
  attr_accessor :b

  def initialize(a, b)
    @a = a
    @b = b
  end
end

t = Test.new(:foo, :bar)
t.a
t.b

attr_accessorインスタンス変数の読み取りと書き込みの両方を行いましょう。読むattr_readerだけなら を、変更だけなら を使いますattr_writer

属性アクセサーの詳細: https://stackoverflow.com/a/4371458/289219

于 2013-07-19T21:34:00.653 に答える
1
class MyClass

  def initialize(title,author)
    @title = title
    @author = author
  end

  def showAuthor
    @author
  end

end

それは...

d = MyClass.new("Grapes of Wrath", "Steinbeck")
d.showAuthor
=> "Steinbeck"
于 2013-07-19T21:35:51.370 に答える