Có khả năng trả lại nhiều giá trị từ phương thức không? Một cái gì đó như thế này:Trả về hai và nhiều giá trị từ phương thức
def do()
return ["a", 10, SomeObject.new]
end
[a, b, c] = do
Có khả năng trả lại nhiều giá trị từ phương thức không? Một cái gì đó như thế này:Trả về hai và nhiều giá trị từ phương thức
def do()
return ["a", 10, SomeObject.new]
end
[a, b, c] = do
def sumdiff(x, y)
return x+y, x-y
end
#=> nil
sumdiff(3, 4)
#=> [7, -1]
a = sumdiff(3,4)
#=> [7, -1]
a
#=> [7, -1]
a,b=sumdiff(3,4)
#=> [7, -1]
a
#=> 7
b
#=> -1
a,b,c=sumdiff(3,4)
#=> [7, -1]
a
#=> 7
b
#=> -1
c
#=> nil
Trong khi quay trở lại nhiều giá trị thường là hữu ích, tôi thường thấy đó là một con trỏ đến một yêu cầu đối tượng mới.
Tức là, tôi thường thấy rằng các giá trị trả về đó được gắn chặt với nhau theo nghĩa/ngữ cảnh và được truyền xung quanh như vậy. Vì vậy, trong những trường hợp này, tôi sẽ tạo một đối tượng mới để kết hợp chúng lại với nhau. Đó là một mùi mã đặc biệt mà tôi đã học được để nhận ra.
tự do hơn, có trách nhiệm hơn. Nhân viên ruby kinh nghiệm sẽ tận dụng lợi thế của nó và viết một số mã đẹp. trong khi các tân binh của ruby có thể làm mọi việc tồi tệ hơn. – fengd
Rõ ràng không phải lúc nào cũng vậy, hoặc những thứ khác như 'chunk' sẽ không tồn tại. Nguyên tắc tuyệt vời mặc dù. Mã mùi thực sự. Rock on. – Fuser97381
Ruby có một hình thức hạn chế về destructuring ràng buộc:
ary = [1, 2, 3, 4]
a, b, c = ary
p a # => 1
p b # => 2
p C# => 3
a, b, *c = ary
p C# => [3, 4]
a, b, c, d, e = ary
p d # => 4
p e # => nil
Nó cũng có một hình thức hạn chế về cơ cấu ràng buộc:
a = 1, 2, 3
p a # => [1, 2, 3]
Bạn có thể kết hợp hai hình thức như sau:
a, b = b, a # Nice way to swap two variables
a, b = 1, 2, 3
p b # => 2
def foo; return 1, 2 end
a, b = foo
p a # => 1
p b # => 2
Có một số việc khác bạn có thể thực hiện với liên kết phá hoại/cấu trúc. Tôi không hiển thị bằng cách sử dụng toán tử splat (*
) ở phía bên tay phải. Tôi không cho thấy làm tổ (bằng cách sử dụng các loại lược). Tôi đã không cho thấy rằng bạn có thể sử dụng bind destruringuring trong danh sách tham số của một khối hoặc phương pháp.
Dưới đây là chỉ là một món khai vị:
def foo(((a, b, c, d), e, *f), g, *h)
local_variables.sort.each do |lvar| puts "#{lvar} => #{eval(lvar).inspect}" end
end
foo([[1, 2, 3], 4, 5, 6], 7, 8, 9)
# a => 1
# b => 2
# c => 3
# d => nil
# e => 4
# f => [5, 6]
# g => 7
# h => [8, 9]
Bạn có thể đạt được điều này trả lại một mảng quá, giống như
def sumdiff(x, y)
[x+y, x-y]
end
mà dường như chức năng tương đương để
def sumdiff(x, y)
return x+y, x-y
end
Bạn nên sử dụng định dạng mã, không phải định dạng văn bản. Dòng thụt lề bốn dấu cách và sự kỳ quặc gây ra bởi dấu nhắc '>>' của irb sẽ biến mất. –
Vì trả về rõ ràng được coi là không phải là thành ngữ của Ruby, bạn cũng có thể sử dụng trả về ngầm bằng cách đặt giá trị trả về một cách rõ ràng trong danh sách: 'def foo_and_bar; ['foo', 'bar']; end' – Dennis