2016-07-10 6 views

答えて

1

あなたはクラスのミネラルでクラス変数にアクセスするためのgetterメソッドを定義する必要があります。 attr_accessorメソッドは、x,ycostインスタンス変数のgetterおよびsetterメソッドを自動的に定義しますが、そのようなクラス変数の機能はありません。

さらに、@@SIGNが定数(実行時に変更される予定)でない場合、@@SIGNの代わりに@@signを使用することをお勧めします。なぜなら、すべての大文字の名前付き変数はルビの定数なので、実行時に変更しようとするとエラーが発生します。

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として:それはあなたがRubyでクラスとインスタンス変数とメソッドの概念をクリアすることで利益になると感じているあなたの質問から

require "./mineral" 

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

。良い出発点はthisです。

コメントまだ疑問や混乱がある場合は、それをクリアしてうれしいです。

はそれが役に立てば幸い:)プログラムの実行時に

+0

@@:

# in your model @@sign = 's' def self.sign @@sign end # usage @map[x][y] = Mineral.sign 

場合、それはではなく、クラス階層の変数の定数使用を変更しません。 SIGN' constant " - ' @@ SIGN'は決して定数ではありません。 – mudasobwa

+0

@mudasobwa '@@ SIGN'が定数でない場合、その変数の名前をすべて大文字にするべきではありません。 Rubyでは、すべての大文字の変数は定数とみなされます。だから、私は彼が '@@ SIGN'の代わりに' @@ sign'を使うことを勧めます。 –

+0

ルビの規則に従っている場合とそうでない場合があります。 'SIGN'は暗黙的に定数として宣言されていますが、' @ SIGN'インスタンスvarや '@@ SIGN'クラスvarや' def SIGN'メソッドもそうではありません。さらに、Rubyコアには、主に 'Kernel'で定義されたメソッドがあります。これらのメソッドには、大文字の' Integer() '、' Array() 'などの名前が付いています。 – mudasobwa

1

ウィル@@SIGN変更?

が変更された場合:この種のクラス階層変数には、Rubyの規約に従って小文字の名前を使用できます。さらに、あなたはgetterメソッド(そしておそらくセッター)を持っている必要があります: `」

# in your model 
SIGN = 's' 

# usage 
@map[x][y] = Mineral::SIGN 
関連する問題