Một trong những điều thú vị về ruby là bạn có thể gọi các phương thức và chạy mã ở những nơi mà các ngôn ngữ khác sẽ nhăn mặt, chẳng hạn như trong các định nghĩa phương thức hoặc lớp.
Ví dụ, để tạo một lớp có siêu lớp chưa biết cho đến khi chạy, tức là ngẫu nhiên, bạn có thể làm như sau:
class RandomSubclass < [Array, Hash, String, Fixnum, Float, TrueClass].sample
end
RandomSubclass.superclass # could output one of 6 different classes.
Điều này sử dụng Array#sample
phương thức 1.9 (chỉ trong 1.8.7, xem Array#choice
) và ví dụ này khá giả tạo nhưng bạn có thể thấy sức mạnh ở đây.
Một ví dụ thú vị khác là khả năng đặt các giá trị tham số mặc định không cố định (như các ngôn ngữ khác thường yêu cầu):
def do_something_at(something, at = Time.now)
# ...
end
Tất nhiên vấn đề với ví dụ đầu tiên là nó được đánh giá ở thời gian xác định, không phải thời gian gọi. Vì vậy, một khi siêu lớp đã được chọn, nó sẽ giữ nguyên siêu lớp đó trong phần còn lại của chương trình.
Tuy nhiên, trong ví dụ thứ hai, mỗi lần bạn gọi do_something_at
, at
biến sẽ là thời gian mà phương thức được gọi (tốt, rất gần với nó)