新しいクラス< Fixnumに属する変数を0から255の間で制限するにはどうすればよいですか? また、Fixnimのサブクラスに制限を作成できない場合、自分のクラスを制限付きで書く方法を教えてください。ルビの変数を制限する方法は?
答えて
継承されないクラスを作成し、method_missing
を使用して、インスタンス変数からすべての関数を呼び出します。戻り値を制限します。
class MyNum
instance_methods.each {|m| eval("undef " << m) }
def initialize(fixnum)
@num = fixnum
end
def method_missing(name, *args, &blk)
ret = @num.__send__(name, *args, &blk)
Numeric === ret ? MyNum.new([[ret, 0].max, 255].min) : ret
rescue NoMethodError
super
end
def inspect
"MyNum(#{@num.inspect})"
end
def class
MyNum
end
end
int = MyNum.new(50) # => MyNum(50)
int += 52 # => MyNum(102)
int.sucC# => MyNum(103)
int + 300 # => MyNum(255)
int = -int # => MyNum(0)
int.zero? # => true
int == 0 # => true
初期化子が0 にデフォルトで設定される必要があり、私は値を負の数に設定するだけでなく、300〜103を追加すると例外がスローされると主張します。 – DJTripleThreat
intと他の数値とを比較することはできますか? – golovanovski
int == 0#false – golovanovski
- は、多数のクラス作るセッターメソッドを経由してあなたクラスの一部として制限され、その番号へのアクセスをしないでください。
- クラス内では、setterメソッド以外のインスタンス変数は設定されません。あなたは、多くの場合、これを実行する必要がある場合は
、そのためのヘルパーメソッドを作る:
class Module def limited_value(name, range=0..100) attr_reader name define_method(:"#{name}=") do |new_value| if range.include?(new_value) instance_variable_set :"@#{name}", new_value else raise "Out of Bounds" end end end end class Foo limited_value :bar, 0..255 end f = Foo.new p f.bar #=> nil f.bar = 10 p f.bar #=> 10 f.bar = 300 #=> tmp.rb:8:in `block in limited_value': Out of Bounds (RuntimeError)
あなたが代わりに実行時エラーを上げるのではなく、最寄りの限界に値を設定することを選択することができます。
- 1. キャプションで変数の出力を制限する方法は?
- 2. スレッドの数を制限する方法
- 3. テンソルフローの変数の範囲を制限する方法
- 4. Prolog - 変数リストの長さを制限する方法
- 5. 最大数を制限する方法
- 6. 長すぎる方向変更を制限する方法は?
- 7. パラメータの制限なしで無制限の引数を取得する方法
- 8. ランドスケープのiPhoneへの変更を制限する方法は?
- 9. 同じデータを使用する複数変数の変数のデータ変更を制限する方法
- 10. 行数や文字数をCSSで制限する方法は?
- 11. 作成されるスレッドオブジェクトの数を制限する方法は?
- 12. バーチャルボックス内のネットワークアダプタの数を制限する方法は?
- 13. Django2.0のURL構文の数を制限する方法は?
- 14. Cargo.tomlのテストスレッドの数を制限する方法は?
- 15. ページング= falseの場合の行数を制限する方法は?
- 16. CQ5のマルチフィールドの要素数を制限する方法は?
- 17. Pythonの線形プログラミング - 変数を整数に制限する方法
- 18. acts_as_ferret - 少数のフィールドに検索を制限する方法は?
- 19. JTextAreaの行数を制限する方法は?
- 20. Tkinter:キャンバスのクリック数を制限する方法は?
- 21. @ Html.TextAreaの文字数を制限する方法は?
- 22. カードデッキの列数を制限する方法は?
- 23. Textarea(Redactor)の行数を制限する方法は?
- 24. AEM 6.2のページバージョン数を制限する方法は?
- 25. Pythonマルチプロセッシング:待機中のプロセス数を制限する方法は?
- 26. データベースの行数を自動的に制限する方法は?
- 27. angularJSの最大文字数を制限する方法は?
- 28. DTPickersの利用可能日数を制限する方法は?
- 29. hrefのテキスト長制限を制限する方法
- 30. crmの整数フィールドの数字を制限する方法
参照、 –
サブクラス化Fixnumかが推奨されていない独自のクラスを書き込むことにより:http://stackoverflow.com/questions/1095789/sub-classing-fixnum-in-ruby – tokland