Kawaii Lab

プログラミングとかサービス開発とか

Rubyのクラスで使う変数について調べてみた

インスタンス変数

インスタンス変数はクラスのインスタンス毎に異なる値を持てる変数
基本的にはこちらを使うことになるだろう

@val

クラス変数

クラス変数はクラスのインスタンス全てで共有される変数
スコープが広いため通常の使用には適さないので、(そもそも別々に生成したオブジェクトが依存しあう関係はよろしくないのではないか)あまり使うタイミングはないと思われる。

@@val

クラス定数

クラス定数は一旦定義するとクラス内で変更ができなくなる変数
継承によるオーバーライドなどの条件に限り値を変更することができる。
特定の日時をもつパターンなど、個々のクラスで意識しなくていい値についてはこちらでいいだろう。 共通項目として開発者に意識させる効果も見込まれる。

VAL

実装するとしたらこんな感じだろうか
例を作るときにいいパターンが思いつかなくて困るな...

require 'date'

class Human
    TIME = Time.now.strftime("%H:%M")
    @@move = "can"

    def canAction
        p "only walk"
    end
end

class Jack < Human
    def initialize(swim)
        @swim = swim
    end

    def canAction
        p "I #@@move walk"
        p "I #@swim swim"
        p "It's time " + TIME
    end
end

class Candy < Human
    def initialize(swim)
        @swim = swim
    end

    def canAction
        p "I #@@move walk"
        p "I #@swim swim"
        p "It's time " + TIME
    end
end

jack = Jack.new("can")
candy = Candy.new("can't")

p "jack ..."
jack.canAction()

p "candy ..."
candy.canAction()
ruby Ruby/Class.rb

"jack ..."
"I can walk"
"I can swim"
"It's time 18:09"
"candy ..."
"I can walk"
"I can't swim"
"It's time 18:09"

Rubyを使っていて思うんだが、紛らわしい文法が多い気がする....
ルールを敷くのも大変だし、組織で開発する場合は苦労しそうだ