是否有可能从方法返回多个值?像这样的东西:
def someMethod()
return ["a", 10, SomeObject.new]
end
[a, b, c] = someMethod
Run Code Online (Sandbox Code Playgroud)
Adi*_*rji 157
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
Run Code Online (Sandbox Code Playgroud)
Jör*_*tag 42
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
Run Code Online (Sandbox Code Playgroud)
它还具有有限形式的结构绑定:
a = 1, 2, 3
p a # => [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)
您可以将这两种形式组合起来:
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
Run Code Online (Sandbox Code Playgroud)
您可以使用解构/构造绑定来执行其他一些操作.我没有*在右侧使用splat operator()显示.我没有展示嵌套(使用parantheses).我没有表明你可以在块或方法的参数列表中使用destructuring bind.
这只是一个开胃菜:
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]
Run Code Online (Sandbox Code Playgroud)
Bri*_*new 16
虽然返回多个值通常很有用,但我通常会发现它是指向新对象要求的指针.
也就是说,我通常会发现这些返回值在意义/上下文中紧密相连,并且这样传递.所以在这些情况下,我会创建一个新对象来将它们联系在一起.这是我学会识别的特殊代码味道.
你可以实现这个返回一个数组,比如
def sumdiff(x, y)
[x+y, x-y]
end
Run Code Online (Sandbox Code Playgroud)
这似乎在功能上等同于
def sumdiff(x, y)
return x+y, x-y
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
67032 次 |
| 最近记录: |