Trong Ruby, mối quan hệ giữa 'new
' và 'initialize
' là gì?
new
thường gọi initialize
. Việc triển khai mặc định là new
là một cái gì đó như:
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
Nhưng bạn có thể, tất nhiên, ghi đè lên để làm bất cứ điều gì bạn muốn.
Làm cách nào để trả về số không khi khởi tạo?
Những gì tôi muốn là:
obj = Foo.new(0) # => nil or false
này không hoạt động:
class Foo
def initialize(val)
return nil if val == 0
end
end
Tôi biết trong C/C++/Java/C#, chúng tôi không thể trả về một giá trị trong một constructor.
Nhưng tôi tự hỏi liệu điều đó có thể xảy ra trong Ruby hay không.
Không có điều nào như một nhà xây dựng trong Ruby. Các nhà xây dựng không cần thiết trong một ngôn ngữ được thiết kế tốt. Trong Ruby, chỉ có các phương thức và các phương thức của khóa học có thể trả về các giá trị.
Vấn đề bạn đang thấy đơn giản là bạn muốn thay đổi giá trị trả về của một phương pháp nhưng bạn đang ghi đè một phương pháp khác. Tất nhiên không hoạt động. Nếu bạn muốn thay đổi giá trị trả lại của phương thức bar
, bạn nên ghi đè bar
, không phải một số phương pháp khác.
Nếu bạn muốn thay đổi hành vi của Foo::new
, sau đó bạn nên thay đổi Foo::new
:
class Foo
def self.new(val)
return nil if val.zero?
super
end
end
Lưu ý, tuy nhiên, đây là một ý tưởng thực sự xấu, vì nó vi phạm hợp đồng của new
, mà là trả về một thể hiện đầy đủ, được khởi tạo đầy đủ của lớp.
Nếu đây là một kiểm tra sự lành mạnh, điều thân thiện hơn là làm tăng ngoại lệ giải thích * tại sao * bạn không tiếp tục khởi tạo. Trả lại nil chỉ là sẽ tạo ra sự nhầm lẫn (nghiêm trọng). Không ai có thể mong đợi một đối tượng mới được khởi tạo là không;) – d11wtq
Không có hàm tạo nào trong 'C'. – YoTengoUnLCD
Ngoại lệ đáng chú ý đối với câu lệnh @ d11wtq sẽ là 'NilClass.new()'. –