2009-12-25 49 views

Trả lời

145
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 
+0

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. –

+2

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

14

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.

+3

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

+0

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

41

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] 
3

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 
Các vấn đề liên quan