我收到了错误
初始化中的块:矿物的未定义方法`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
答案 0 :(得分:1)
您需要定义getter
方法来访问类Mineral中的类变量。 attr_accessor
方法会自动为x
,y
,cost
实例变量定义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