1

谁能告诉我这个函数的返回值给了列出的参数:

def sequence(*enumerables)
    enumerables.each do |enumerable|
        print "#{enumerable},"
    end
end

a,b,c = [1,2,3],4..6,'a'..'e'

value = sequence(a,b,c)
print value

为什么该值被评估为:

[[1,2,3],4..6,"a".."e"]
4

3 回答 3

3

请记住,堆栈中的最后一件事是您的方法的返回值。情况总是如此。如果返回值很重要,则必须密切注意如何退出方法。

each方法返回它一直在迭代的内容。由于each是方法中的最后一条语句,因此按堆栈方式返回该值。

您可以通过不返回任何内容来解决此问题:

def sequence(*enumerables)
  enumerables.each do |enumerable|
    print "#{enumerable},"
  end

  return
end

这种方法通常不受欢迎,因为该return方法似乎不合适。如果此方法的调用者不期望任何特定的返回值,则没有必要。

另一种方法是返回一些有用的东西:

def sequence(*enumerables)
  enumerables.join(",")
end

puts sequence(a,b,c)

通常情况下,未对特定返回值设置期望的方法可能会返回任意值。

于 2013-09-13T15:19:01.383 回答
3

enumerables是一个数组。splat ( *) 运算符会导致这种情况。

的返回值sequence是它的返回值enumerables.eachenumerables

一个简单的例子:

def foo(*args)
  args
end

foo(1,2,3,4) == [1,2,3,4] # true
于 2013-09-13T15:10:53.387 回答
2

您正在返回enumerables,这是一个包含该方法的所有参数的数组。

你期望value包含什么?您没有做出任何显式尝试返回任何内容,因此方法中的最后一条语句解析为“脱落”该方法以成为其返回值的任何值。

于 2013-09-13T15:10:55.000 回答