2009-12-25 42 views

回答

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

您應該使用的代碼格式,而不是文本格式。縮進行四個空格,由irb的'>>'提示引起的奇怪現象將消失。 – 2009-12-25 15:31:53

+2

由於顯式返回被認爲是非慣用的Ruby,所以你也可以通過顯式地將返回值放在一個列表中來使用隱式返回:'def foo_and_bar; ['foo','bar'];結束' – Dennis 2014-12-09 13:06:31

14

雖然返回多個值通常是有用的,我通常會發現這是一個指向一個新的對象的要求。

也就是說,我通常會發現那些返回值在意義/上下文中緊密聯繫在一起,並且都是這樣傳遞的。所以在這些情況下,我會創建一個新的對象來將它們連接在一起。這是我學會識別的一種特殊的代碼味道。

+3

更自由,更多的責任。有經驗的rubyist會利用它並寫出一些漂亮的代碼。而紅寶石新手可能會讓事情變得更糟。 – fengd 2013-11-05 17:07:32

+0

很明顯,情況並非總是如此,否則'chunk'就不會存在。優秀的原則,但。代碼聞起來確實。搖滾。 – Fuser97381 2015-11-26 16:18:35

41

Ruby有解構綁定的限量表:

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 

它還具有結構綁定的限量表:

a = 1, 2, 3 
p a # => [1, 2, 3] 

你可以結合這兩種形式,像這樣:

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 

您可以使用解構/結構化綁定來做其他幾件事情。我沒有在右側顯示使用圖示操作符(*)。我沒有顯示嵌套(使用parantheses)。我沒有表明可以在塊或方法的參數列表中使用解構綁定。

這裏只是一道開胃菜:

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

你可以做到這一點也返回一個數組,像

def sumdiff(x, y) 
    [x+y, x-y] 
end 

這似乎功能上等同於

def sumdiff(x, y) 
    return x+y, x-y 
end