Techioz Blog

Ruby で、組み込み型と同じように特定のインスタンス変数を取得および設定する方法はありますか?

概要

Ruby では、他の言語と同様に、次のように組み込み型を取得および設定できます。

var1 = 12
if var1 > 10
  var1 = 90
end

ここで、私が(たとえば)符号なし整数のみを扱い、次のクラスを作成したい愚かな愚かな人だとしましょう。

class UInteger
  attr_accessor :value
  ...
end

組み込み変数のゲッターとセッターを模倣して、呼び出しによる値へのアクセスを回避する方法はありますか

uint.value

または

uint.value = ...

常に、と置き換えてください

uint

または

uint = ...

?

解決策

はい、しかしそれは決して組み込みの「型」に限定されるものではありません。カスタム クラスのインスタンスを使用して、まったく同じコードを使用できます。意味のある > メソッドを提供する必要があります。例: (デモ目的のため、このクラスは有用なことは何も行いません)

class UInteger
  def initialize(value)
    @value = value.to_i
  end

  def >(other)
    @value > other.to_i
  end

  def to_i
    @value
  end
end

それ以外の場合、コード構造は同じままです。

var1 = UInteger.new(12)
if var1 > UInteger.new(10)
  var1 = UInteger.new(90)
end

var1 #=> #<UInteger:0x00007f898992ebf8 @value=90>

グローバル メソッド UInteger() を追加して、新しいインスタンスをより簡単に作成することもできます (BigDecimal のように)。また、あまり技術的ではない出力のために、その構文に似たカスタム検査メソッドを追加することもできます。

class UInteger
  # ...

  def inspect
    "UInteger(#{@value})"
  end
end

def UInteger(value) = UInteger.new(value)

上記の変更により、コードは次のようになります (これらの変更は純粋に表面的なものであり、以前と同様に UInteger のインスタンスです)

var1 = UInteger(12)
if var1 > UInteger(10)
  var1 = UInteger(90)
end

var1 #=> UInteger(90)

もちろん、UInteger インスタンスは実際の整数ではありません。整数値が必要な場合は、それを変換する必要があります。例:

var1 = UInteger(90)

var1.to_i #=> 90

これは、文字列のような組み込みクラスからインスタンスを変換することと何ら変わりません。

var1 = "90"

var1.to_i #=> 90