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