2016-06-13 6 views
1

私は以下のモジュールを持っています.1つの変数には仮説年の最初の日の文字列、文字列を出力する1つのメソッド、そして文字列を出力するもう1つのメソッドがあります。
モジュールとモジュールからの変数のアクセス(Ruby言語)

module Week 
    first_day = "Sunday" 

    def weeks_in_month 
    puts "There are 4 weeks in a month" 
    end 

    def weeks_in_year 
    puts "There are 52 weeks in a year" 
    end 
end 

は、私は今、唯一の目的のクラスはモジュールの中にあり、変数をプリントアウトすることであります。私は今、十年をインスタンス化し、メソッドにアクセス

class Decade 
    include Week 

    def firstday 
    puts Week::first_day 
    end 
end 

(これはテスト目的のためだけです)モジュールを使用して10年前のオブジェクト。

undefined method `first_day' for Week:Module (NoMethodError) 

私はルビーに新しいですし、ちょうどモジュールに慣れていますので、任意のヘルプは次のようになります。私が手にエラーがある

z = Decade.new 
z.weeks_in_month 
z.weeks_in_year 

z.firstday #Errors here 

firstdayメソッドを呼び出すときに私のプログラムが問題に実行されます感謝。モジュールを書くとき

+0

'{}'ボタンやインデントの4つのスペースでコードをフォーマットするのを忘れないでください。 – tadman

答えて

0

が慣例は次のように定数を宣言することです:彼らはALL_CAPSにいる

module Week 
    FIRST_DAY = 'Sunday' 
end 

注こと。大文字で始まるものはすべて定数として扱われます。そのソートの小文字の名前はローカル変数として扱われます。

一般に、別のモジュールの定数にアクセスするのは悪いフォームです。リファクタリング機能が制限されています。代わりにパブリックアクセサメソッドを定義:

module Week 
    def first_day 
    FIRST_DAY 
    end 
end 

を今、あなたは、外部のことを呼び出すことができます。

Week.first_day 

はあなたにもそれが実現しています方法を変更することができます:

module Week 
    DAYS = %w[ 
    Sunday 
    Monday 
    Tuesday 
    ... 
    Saturday 
    ] 

    def first_day 
    DAYS.first 
    end 

    extend self # Makes methods callable like Week.first_day 
end 

ことについての素晴らしい事はありますfirst_dayメソッドはまったく同じことを行い、他のコードを変更する必要はありません。これにより、リファクタリングが大幅に簡単になります。これらのすべてのインスタンスを追跡して置き換えてWeek::FIRST_DAYに置き換えなければならないと想像してください。

ここで注意すべき点がいくつかあります。最初はmoduleincludeと呼ぶといつでもの定数がローカルに読み込まれます。もう1つは、ミックスインモジュールを定義するときです。ターゲットクラスとの競合を避けるために、名前に注意してください。

これを混在させているので、名前空間の接頭辞は必要ありません。ちょうどfirst_dayを呼び出すだけです。

+0

ああ、定数の大文字は慣習だと思っていましたが、実際の構文であると推測しています。そのため、コンパイルされなかったのです。クラス定義とコンストラクタの間の値を定義することは自動的にクラス変数とみなされ、必ずしもローカル変数とはみなされないJavaバックグラウンドから来ているので、Rubyとの混乱です。入力いただきありがとうございます。 – JmanxC

関連する問題