【问题标题】:Return an array between start A and B返回开始 A 和 B 之间的数组
【发布时间】:2016-06-27 07:52:40
【问题描述】:
$array = []
def range(start_position,end_position)
  for i in start_position..end_position
    $array.push(i)
    puts $array
  end 
  return $array
end 

range(1,10)

我想知道为什么我的数组没有返回。显然,当我确实 puts $array 时,正在插入 1-10,但是当我调用我的函数时,我希望返回数组。任何想法,我正在阅读文档,但找不到我做错了什么或者我是否犯了任何语法错误。

【问题讨论】:

  • 哦,我只是在测试数字是否被放入数组中,因为当我调用该函数时它们根本没有显示。仅用于调试目的
  • 你应该避免使用全局变量(即使用foo而不是`$foo$)。

标签: ruby


【解决方案1】:

它返回一个数组,但你没有对它做任何事情,所以它被丢弃了。您可以打印它(使用 p range(1,10)puts range(1,10) )或将其分配给一个变量供以后使用( result = range(1,10) )。和result = (1..10).to_a一样,根本不用你的方法。

【讨论】:

  • 当我放 range(1,10) 时它起作用了,但它只是输出 1,然后是下一行 2,一直到 10 的另一行。如何让它输出像 [1,2,3,..10] 这样的实际数组?
  • puts 用于向最终用户显示某些内容; p 更多地用于向程序员展示东西。使用 p range(1,10).
  • 嗯,我在网上读了一点。我可以推断出 p,基本上会打印特定值的完整数组吗?
  • 太好了,谢谢。今天早上刚开始学习 ruby​​,它比 js 和 c++ 更友好:o
  • 实际上,由于您在方法之外声明了$array(这太可怕了),它可用的;只需将p $array 添加到您的代码中即可。
【解决方案2】:

您的代码基本上是正确的,您只需在 for 块中省略 puts $array 即可。而且也不需要可选的return 关键字。所以修复你的代码我们会:

$array = []
def range(start_position,end_position)
  for i in start_position..end_position
    $array.push(i)
  end 
  $array
end 

p range(1,10) #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

Kernel#p 执行Kernel#inspect 方法,如文档中所述,该方法提供了相关对象的人类可读表示。在 Ruby 中,这样做可能会更好:

def range(start_position,end_position)
  (start_position..end_position).map {|i| i }
end 

p range(1,10) #=> [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

【讨论】:

  • 很好用。请问我的代码有什么问题,p数组是什么意思?
  • 这里对 map 的使用有点困惑。在文档中它说 if arr = [1,2,3,4,5], arr.map{|i| i},创建一个包含 1,2,3,4,5 的新数组,对吗?如果是这样,我们必须把它放在一个变量中。你在那个声明中返回了什么?我来自你需要返回的语言,所以你返回的内容有点奇怪。
  • 哦,没关系,我看到你做了什么。谢谢。很酷的解决方案,肯定好多了
  • 不用担心,你知道在 Ruby 中,如果我们调用一个方法,那么 last 行代码总是该方法的返回值。
  • 虽然可以返回一些很长的代码,但它不会有坏处吗?
【解决方案3】:

你的数组确实返回了,但是你没有对返回值做任何事情。尝试将其保存到变量或打印结果:

print range(1, 3) # => [1, 2, 3]

如果您正在寻找一种更简单的方法来实现此功能,您可以使用 Ruby 范围来执行此操作,例如:

def range (start_position, end_position)
    # Create a range and convert it to an array
    # We can omit return
    (start_position .. end_position).to_a
end

print range(1, 3) # => [1, 2, 3]

还要注意你的函数只会在第一次工作,因为你使用一个全局变量作为你的起点。检查多次调用时会发生什么:

print range(1, 3) # => [1, 2, 3]
print range(1, 3) # => [1, 2, 3, 1, 2, 3]

【讨论】:

  • 酷。感谢那。看起来 ruby​​ 有很多我可以使用的内置函数
猜你喜欢
  • 1970-01-01
  • 2017-12-24
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 2012-06-26
  • 1970-01-01
  • 2019-12-18
相关资源
最近更新 更多