Không, Ruby không thực sự hỗ trợ trả lại 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ả lại 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 ở phía bên tay phải của một bài tập, 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 "mục tiêu" (phương pháp biến hoặc setter) ở bên trái bên -Tay của một bài tập, các biến được ràng buộc với các yếu tố của một Array
ở phía bên tay 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 tay phải là không một Array
, nó sẽ được chuyển đổi sang một sử dụng phương thức to_ary
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 đặt hai cùng nhau, chúng tôi nhận được rằng
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 vấn đề này là các nhà điều hành splat ở phía bên trái của một bài tập.Nó có nghĩa là "mất tất cả các yếu tố còn sót lại của Array
ở phí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, nhiệm vụ song song có thể được lồng vào nhau bằ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 hoặc yield
đến 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
yield 1, 2
# is the same as
return [1, 2]
next [1, 2]
break [1, 2]
yield [1, 2]
Bằng cách này, điều này cũng làm việc trong danh sách tham số của phương pháp và khối (với các phương pháp là nghiêm ngặt hơn và khối ít nghiêm ngặt):
def foo(a, (b, c), d) p a, b, c, d end
bar {|a, (b, c), d| p a, b, c, d }
Blocks là "ít nghiêm ngặt" là ví dụ những gì làm cho Hash#each
công việc. Nó thực sự yield
sa đơn hai yếu tố Array
khóa và giá trị cho các khối, nhưng chúng ta thường viết
some_hash.each {|k, v| }
thay vì
some_hash.each {|(k, v)| }
Về mặt kỹ thuật, Ruby không trả về hai giá trị. Nó có thể trả về một mảng mà lần lượt được gán cho hai biến. –