Как я могу ограничить переменную, которая принадлежит новому классу < 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
Initializer должен по умолчанию 0. I будет утверждать, что добавление от 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. Как ограничить переменную в Matlab
- 2. как инициализировать переменную типа «двойной» в рубине
- 3. Ограничить конкретную переменную в Bash
- 4. Как ограничить количество результатов в рубине google-search?
- 5. Чтобы передать переменную блокировки в Рубине неявным
- 6. Можно ли переопределить переменную в рубине?
- 7. Как ограничить переменную фиксированным набором строк?
- 8. Как ограничить переменную недоступностью вне класса в java?
- 9. setrlimit в Рубине
- 10. Как хлюпать в рубине
- 11. Как работает === в рубине?
- 12. Как напечатать \»в Рубине
- 13. как подстроить в рубине
- 14. Доступ к хешу через переменную в рубине на рельсах
- 15. Пропустив первую переменную (ы) при выполнении многократного назначения в Рубине
- 16. Временные операции в рубине
- 17. Использование JavaScript во встроенном Рубине передать переменную в качестве параметра
- 18. Защита резьбы в рубине
- 19. В рубине, как мне написать метод «сделать» в рубине?
- 20. класс в рубине (объявление класса в рубине)
- 21. Как использовать JavaScript переменные в рубине
- 22. Как сортировать! массивы в рубине
- 23. Как сцепить это в Рубине
- 24. Как реализовать argmax в рубине?
- 25. Как вернуть JSON в рубине?
- 26. Как отменить [] скобки в рубине?
- 27. Как связать разыменование в рубине?
- 28. Как отсортировать строку в рубине?
- 29. Как сочетать/переставлять в рубине?
- 30. Как открыть файл в рубине
Написав свой собственный класс –
суб-причислять Fixnum не рекомендуется, см: http://stackoverflow.com/questions/1095789/sub-classing-fixnum-in-ruby – tokland