1

私は自分のクラスを持っています

class Mutnum
    attr_reader :value
    def initialize(number)
        raise TypeError, "Mutnum created on a non-numeric value" unless number.is_a? Numeric
        @value = number
    end
    def ==(other)
        if other.is_a? Mutnum
            other.value == @value
        else
            @value == other
        end
    end
    def set(newval)
        @value = newval
    end
    def to_i
        @value
    end
    def to_s
        @value.to_s
    end
    def +(other)
        if other.is_a? Numeric
            @value + other
        elsif other.is_a? Mutnum
            Mutnum.new(@value + other.value)
        end
    end
    def coerce(other)
        if other.is_a? Numeric
            [other, @value]
        else
            super
        end
    end
end

これは基本的に変更可能な数値として機能します (たとえば、1 を関数に渡し、その関数で変更し、呼び出された場所から結果を読み取ることができます)。これを使用して、同じアプリケーションで wxRuby と gosu を使用する際の煩わしさを軽減しています。

のように言えるようになりたいArray#[Mutnum][1,2,3,4][Mutnum.new(3)]という結果になるはず4です。

Mutnum を配列インデックス\editとして使用できるようにするには、他にどのような関数を Mutnum editに追加する必要がありますか? と言えると思いますが、さらにデバッグを行う必要があります。[1,2,3,4][Mutnum.new(3).to_i]

4

1 に答える 1

0

変更可能な数値などはありません。しかし、数値を含むことができるデータ構造があります。MutableNumberは一般的に彼らにとって良い名前ではありません。このようなコンテナ クラスを使用する方法は次のとおりです。

class Container
  attr_accessor :value

  def initialize value
    @value = value
  end
end

A, B = Container.new( 42 ), Container.new( 43 )

あなたがしたいことのために、あなたは言わなければならないでしょう

[1, 2, 3, 4][ Container.new( 3 ).value ]

それを乗り越えてください。これがサブクラスの 1 つであることを想定して、多くのメソッドを委譲することができます。しかし、方法論では原理が違うのでうまくいきません。取得する主なポイントは、コンテナーは実際には数値ではないということです。@valueNumericArray#[]

定義する必要があります

class EasyArray < Array
  def [] arg
    index = arg.value rescue arg
    super index
  end
end

EasyArray[ 1, 2, 3, 4 ][ Container.new( 3 ) ] #=> 4

全体として、最善の策は、独自のコンテナ クラスを定義するのではなく、私のYNelsongem のペトリ ネットを使用することです。gem install y_nelson. インストールしたら、ペトリ ネット プレースをコンテナーとして使用します。

require 'y_nelson' and include YNelson
P, Q = Place( m: 2 ), Place( m: 3 )
[ P, Q ].map &:value #=> 2, 3

コンピューター科学者が変更可能な数値を求める場合、ペトリ ネット プレースを使用することを思い出してください。

于 2014-03-22T17:24:24.273 に答える