Может ли Fixnum/Float быть нулевым?

Может ли Fixnum/Float быть нулевым? В этом случае само собой может быть даже ноль:

class Fixnum
  def clamp(min, max)
    if self == nil then nil end
    ...
  end
end

4 ответа

Решение

Это невозможно, потому что nil имеет свой собственный класс,NilClass:

irb(main):001:0> nil.class
=> NilClass
irb(main):002:0> 456.class
=> Fixnum

Таким образом, переменная может быть Fixnum или NilClass но не оба.

В контексте метода экземпляра класса, self всегда ссылается на экземпляр, который имеет тип класса.

Также self не может быть изменено:

irb(main):006:0> class C
irb(main):007:1>   def z
irb(main):008:2>     self = nil
irb(main):009:2>   end
irb(main):014:1> end
SyntaxError: (irb):8: Can't change the value of self
self = nil
      ^
        from D:/dev/Ruby20/bin/irb:12:in `<main>'

Просто спросите Руби:

nil.is_a? Fixnum
# false
nil.is_a? Float
# false

Нет. Объект - это либо Fixnum, либо NilClass. self всегда является типом текущего класса.

Нету. Единственный способ self может равняться nil если ты внутри NilClass,

class NilClass
  def self_is_nil?
    self == nil
  end
end

nil.self_is_nil? # => true
Другие вопросы по тегам