1

私は、ペンと紙の RPG をスクリプトに変換することで、Ruby を操作してきました。

現在、キャラクターの統計をハッシュに保持していますが、これを public メソッドで設定できるようにしたいと考えています。私はそれを使って作業しました:

class Character
    attr_reader :str, :con, :dex, :wis, :int, :level, :mods, :stats
    def initialize str, con, dex, wis, int, cha, level = 1
        @stats = { :str => str, :con => con, :dex => dex, :wis => wis, :int => int, :cha => cha }
        @mods = {}
        @level = level

        @stats.each_pair do |key, value|
            @mods[key] = ((value / 2 ) -5).floor
        end
    end

    def []=(index, value)
        @stats[index] = value
    end
end

@statsこれにより、新しいキャラクターをインスタンス化し、実行して更新することができますnewChar.stats[:str] = 12

@modsただし、この方法を使用し て変更することもできるようですが、これは望ましくありません。newChar.mods[:str] = 15ハッシュを正常に変更し@modsますが、これは私の理解では、現在のセッター メソッドでは不可能なはずです。

少し別のメモとして、@modsハッシュを作成するために使用しているイテレータは扱いにくいようですが、タスクを達成するためのより良いものは見つかりませんでした。

4

2 に答える 2

3

ハッシュの public getter が必要であるが、ユーザーにハッシュ (クラスのインスタンス変数) を変更させたくない場合は、dup を使用してそれを行うことができます。

class MyClass
  ....
  def my_hash
    @my_hash.dup
  end
end

freeze上記のように、 を使用したソリューションでは、クラスのハッシュも凍結されますが、.dup-solution を使用すると、クラス内からハッシュを変更できますが、外部からは変更できません。

于 2013-08-15T20:49:41.593 に答える