Ruby - `block in initialize':未定义的方法

时间:2016-07-10 08:51:54

标签: ruby

我收到了错误

  初始化中的

块:矿物的未定义方法`SIGN':类(NoMethodError)

我该如何解决?

 require "./mineral"

    .
    .
    .
    @map[x][y] = Mineral.SIGN

我的课程:

class Mineral
  attr_accessor :x, :y, :cost, :SIGN
  @@SIGN = "s"
  def initialize(x, y)
    @x,@y = x,y
    @cost = rand 10
  end
end

2 个答案:

答案 0 :(得分:1)

您需要定义getter方法来访问类Mineral中的类变量。 attr_accessor方法会自动为xycost实例变量定义getter和setter方法,但类变量没有这样的工具。

此外,如果@@SIGN不是常量(预计会在运行时更改),那么我建议您使用@@sign代替@@SIGN。因为,所有大写命名变量都是ruby中的常量 - 如果尝试在运行时更改,则会引发错误。

class Mineral
attr_accessor :x, :y, :cost
@@sign = "s"
def initialize(x, y)
    @x,@y = x,y
    @cost = rand 10
end

def self.get_sign
    @@sign
end
end

此外,您可以访问@@sign

require "./mineral"

    .
    .
    .
    @map[x][y] = Mineral.get_sign

从您的问题中,您可以通过清除ruby中的类和实例变量和方法的概念来获益。一个很好的起点是this

如果您仍有疑问或疑惑,请注意清楚。

希望有所帮助:)

答案 1 :(得分:1)

在程序运行期间@@SIGN会改变吗?

如果将更改:您可能希望遵循Ruby约定并对此类类层次结构变量使用小写名称。此外,您将需要一个getter方法(也许是一个setter):

# in your model
@@sign = 's'
def self.sign
  @@sign
end

# usage
@map[x][y] = Mineral.sign

如果不会改变使用常量而不是类层次结构变量:

# in your model
SIGN = 's'

# usage
@map[x][y] = Mineral::SIGN