В Ruby, что отношения между 'new
' и 'initialize
'?
new
обычно звонит initialize
. Реализация по умолчанию new
что-то вроде:
class Class
def new(*args, &block)
obj = allocate
obj.initialize(*args, &block)
# actually, this is obj.send(:initialize, …) because initialize is private
obj
end
end
Но вы можете, конечно, изменить это делать все, что вы хотите.
Как вернуть нуль при инициализации?
Что я хочу:
obj = Foo.new(0) # => nil or false
Это не работает:
class Foo
def initialize(val)
return nil if val == 0
end
end
Я знаю, что в C/C++/Java/C#, мы не можем возвращать значение в конструкторе.
Но мне интересно, возможно ли это в Ruby.
Существует не такая вещь, как конструктор в Ruby. Конструкторы не нужны на хорошо продуманном языке. В Ruby существуют только методы и конечно методы могут возвращать значения.
Проблема, которую вы видите, состоит в том, что вы хотите изменить возвращаемое значение одного метода, но вы переопределяете другой метод. Конечно это не работает. Если вы хотите изменить возвращаемое значение метода bar
, вы должны переопределить bar
, а не какой-либо другой метод.
Если вы хотите изменить поведение Foo::new
, то вы должны изменить Foo::new
:
class Foo
def self.new(val)
return nil if val.zero?
super
end
end
Заметим, однако, что это действительно плохая идея, так как он нарушает договор new
, который состоит в том, чтобы вернуть полностью инициализированный, полностью функционирующий экземпляр класса.
Если это проверка работоспособности, более удобной задачей было бы поднять Исключение, объясняющее * почему * вы не продолжаете инициализацию. Возвращение ноль просто создаст (серьезную) путаницу. Никто никогда не ожидал, что новый экземпляр объекта будет равен нулю;) – d11wtq
В 'C' нет конструкторов. – YoTengoUnLCD
Заметным исключением для оператора @ d11wtq будет 'NilClass.new()'. –