Thật không may, điều này là không thể.
Đây là một trong những trường hợp gây phiền nhiễu mà Ruby không hướng đối tượng. Trong OO, phải có thể cho một đối tượng mô phỏng một đối tượng khác (thực tế, tùy thuộc vào người bạn hỏi, đây là định nghĩa của OO - hãy nhớ rằng OO đã được mô phỏng), nhưng không thể xây dựng một đối tượng mô phỏng false
. Điều này là bởi vì, trong Ruby, các cấu trúc điều khiển có điều kiện được đưa vào ngôn ngữ và không dịch thành tin nhắn gửi đi, trong khi đó các ngôn ngữ OO khác chỉ là thông điệp gửi thông thường (hoặc ít nhất dịch thành tin nhắn gửi đi, giống như for
trong Ruby dịch thành each
). Ví dụ, trong Smalltalk, Booleans đang thực sự thực hiện bằng cách sử dụng mã hóa Church of Booleans bạn biết từ Lambda Calculus, và dịch Ruby họ nhìn một chút như thế này:
class FalseClass
def if(&block)
# do nothing
end
def if_then_else(then_lambda, else_lambda)
else_lambda.()
end
def not
true
end
def and(&block)
self
end
def or(&block)
block.()
end
end
Và TrueClass
chỉ là hình ảnh phản chiếu:
class TrueClass
def if(&block)
block.()
end
def if_then_else(then_lambda, else_lambda)
then_lambda.()
end
def not
false
end
def and(&block)
block.()
end
def or(&block)
self
end
end
Và sau đó, thay vì một cái gì đó giống như
if 2 < 3 then foo end
if 2 < 3 then bar else baz end
Bạn sẽ phải
(2 < 3).if { foo }
(2 < 3).if_then_else(-> { bar }, -> { baz })
# using the new keyword arguments in Ruby 2.0, it almost reads like Smalltalk:
class FalseClass
def if(then: -> {}, else: -> {})
else.()
end
end
class TrueClass
def if(then: -> {}, else: -> {})
then.()
end
end
(2 < 3).if(then: -> { bar }, else: { baz })
Bằng cách đó, bạn có thể dễ dàng tạo đối tượng mô phỏng false
chỉ đơn giản bằng cách triển khai các phương pháp tương ứng.
Trong trường hợp khác, nơi một số đối tượng thực sự hoàn toàn phải là một phiên bản của một lớp cụ thể chứ không chỉ nói đúng giao thức, Ruby cung cấp một lối thoát hiểm. Ví dụ: nếu một phương thức thực sự là yêu cầu một đối số, thì trước tiên nó sẽ cố gắng gọi to_ary
để ít nhất cho bạn cơ hội chuyển đổi đối tượng của mình thành một Array
.Điều tương tự cũng xảy ra với to_str
, to_int
, to_proc
, to_float
v.v. Nhưng không có giao thức to_bool
tương đương.
Không rõ: giá trị 'Klass.method (giá trị)' là phương pháp 'Object #'? Nó lấy một tên phương thức làm đối số và trả về một phương thức mà sau này bạn có thể gọi 'call'. – user1852994
thay vào đó, hãy tưởng tượng một "mới" hoặc một hàm tạo –