返回红宝石的价值很奇怪

时间:2013-09-13 15:04:36

标签: ruby return

任何人都可以告诉我这个函数的返回值给出了列出的参数blew:

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

3 个答案:

答案 0 :(得分:3)

enumerables是一个数组。 splat(*)运算符会导致此问题。

sequence的返回值是enumerables.each的返回值enumerables

一个简单的例子:

def foo(*args)
  args
end

foo(1,2,3,4) == [1,2,3,4] # true

答案 1 :(得分: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)

通常情况下,没有为特定返回值设置期望的方法可能会返回任意一个。

答案 2 :(得分:2)

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

您期望value包含哪些内容?你还没有明确地尝试返回任何东西,所以无论方法中的最后一个语句解决的是什么值,都会失败。成为其返回值的方法。