Không, Ruby không thực sự hỗ trợ trả về hai đối tượng. (BTW: bạn trả về các đối tượng, không phải biến. Chính xác hơn, bạn trả về con trỏ cho các đối tượng.)
Tuy nhiên, nó hỗ trợ gán song song. Nếu bạn có nhiều hơn một đối tượng ở bên phải của một phép gán, các đối tượng được thu thập vào một Array
:
foo = 1, 2, 3
# is the same as
foo = [1, 2, 3]
Nếu bạn có nhiều hơn một "target" (biến hoặc phương thức setter) ở phía bên trái của một phép gán, các biến sẽ bị ràng buộc với các phần tử của một Array
ở phía bên phải:
a, b, c = ary
# is the same as
a = ary[0]
b = ary[1]
c = ary[2]
Nếu phía bên phải không phải là một Array
, nó sẽ được chuyển đổi thành một bằng cách sử dụng to_ary
phương thức
a, b, c = not_an_ary
# is the same as
ary = not_an_ary.to_ary
a = ary[0]
b = ary[1]
c = ary[2]
Và nếu chúng ta kết hợp cả hai lại với nhau, chúng ta sẽ có
a, b, c = d, e, f
# is the same as
ary = [d, e, f]
a = ary[0]
b = ary[1]
c = ary[2]
Liên quan đến điều này là toán tử biểu tượng ở phía bên trái của một phép gán. Nó có nghĩa là "lấy tất cả các phần tử Array
bên trái của bên tay phải":
a, b, *c = ary
# is the same as
a = ary[0]
b = ary[1]
c = ary.drop(2) # i.e. the rest of the Array
Và cuối cùng nhưng không kém phần quan trọng, các phép gán song song có thể được lồng vào nhau bằng cách sử dụng dấu ngoặc đơn:
a, (b, c), d = ary
# is the same as
a = ary[0]
b, c = ary[1]
d = ary[2]
# which is the same as
a = ary[0]
b = ary[1][0]
c = ary[1][1]
d = ary[2]
Khi bạn return
từ một phương pháp hay next
hoặc break
từ một khối, Ruby sẽ đối xử tử tế của việc này như phía bên tay phải của một bài tập, vì vậy
return 1, 2
next 1, 2
break 1, 2
# is the same as
return [1, 2]
next [1, 2]
break [1, 2]
Nhân tiện, điều này cũng hoạt động trong danh sách tham số của các phương thức và khối (với các phương thức nghiêm ngặt hơn và khối ít nghiêm ngặt hơn):
def foo(a, (b, c), d) p a, b, c, d end
bar {|a, (b, c), d| p a, b, c, d }
Ví dụ như các khối "ít nghiêm ngặt hơn" là điều tạo nên Hash#each
hiệu quả. Nó thực sự yield
sa đơn phần tử hai Array
chìa khóa và giá trị cho các khối, nhưng chúng ta thường ghi
some_hash.each {|k, v| }
thay vì
some_hash.each {|(k, v)| }