0

我创建了以下简单类:

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

  def test
    puts @a
  end
end

有没有办法@a代替self?每次我尝试这样做时,都会收到一个错误:

undefined method `a'

我这样做的原因是因为我想创建一个带有两个参数的新对象,然后对这些参数进行操作,例如:

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 回答
2

它可以并且实际上为这些类完成的:Array、String、Integer、Float、Rational、Complex 和 Hash。如果您认为 Test 类(顺便说一句不好的名字)同样重要,那么请考虑:

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

  def test
    puts @a
  end
end

module Kernel
  def Test(*args)
    Test.new(*args)  #that's right, just call new anyway!
  end
end

book = Test('title', 'Author')
book.test # => title

由于Kernel模块由 继承Object,全局命名空间现在有一个 Test 方法。除非您绝对需要,否则不要这样做。

于 2013-07-19T22:17:25.293 回答
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

当您使用 时self.a,Ruby 正在寻找a由 表示的类的方法self,因此您会得到一个未定义的方法错误(因为您没有定义一个名为 的方法a)。您可能正在寻找:

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 回答