【问题标题】:How to write single-line from multi-line blocks in ruby?如何在 ruby​​ 中从多行块编写单行?
【发布时间】:2013-05-23 08:18:26
【问题描述】:

我正在尝试为数组 (@controller) 中的每个实体编写单行块,这个单行块的目的是从控制器数组中产生 [n] 元素,n 是一个访问器,现在我想类似的东西:

def for_controller
 controller = @controllers.first[n] 
 yield controller
end

不幸的是,我写的单个块不起作用,但下面的多行块在循环中完美地工作。

def for_all_controllers
  @controllers.each do |controller|
    yield controller
  end
end

为了让问题更清楚:

@controllers[0] should yield => something_1
@controllers[1] should yield => something_2
@controllers[n] should yield => something_(n+1)

我怎样才能让它工作?

【问题讨论】:

  • 在您的第一个方法中,您使用的是@controllers.first[n],但方法for_controller 没有参数nn 来自哪里?
  • 也许您只是在寻找没有[n]@controllers.first
  • 阅读以下答案

标签: ruby arrays methods block


【解决方案1】:

您的示例代码看起来有问题。

@controllers.first[n]

这会从@controller.first返回的数组中获取第n个元素。

但在你的问题中,你说:

从控制器数组中生成 [n] 元素

我认为您期望的是数据结构 (a),而不是 (b)。

(a)
@controllers = [
  'something',    # <= @controller.first returns this element, as you expected
  'something',
  'something'
]

(b)
@controller = [
  ['something', 'something', 'something'],
  ['something', 'something', 'something'],
  ['something', 'something', 'something']
]

我认为您应该尝试以下方法:

@controllers.first(n)

它从@controller 返回前n 个元素。这是你预期的结果,对吧?

【讨论】:

  • n - 是数组中的任何元素,例如我想产生 @controllers[0] 它应该产生 => something_1;我想产生 @controllers[1] 它应该产生 => something_2;我想产生 @controllers[n] 它应该产生 => something_n。我希望现在目标明确?
  • 如果要访问@controller 的一个元素,.first 不需要:@controller[n] 有效。如果您想访问@controller 的多个元素,请尝试@controller[n,m]
  • 我需要按顺序访问元素,我有类似 n =0; 的东西n= n+1;所以每个循环变量 n,在另一个函数中增加 1。所以,我需要一个函数来产生每个 @controller[n],如何组织函数?
【解决方案2】:

这是你要找的吗?

def for_controller
 yield @controllers[n]
end

【讨论】:

  • 也许 :) 但是 n 是一个访问器,我们是否需要在方法声明中准确地使用 n ?如果是,请解释原因,谢谢!
猜你喜欢
  • 2019-01-21
  • 2014-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-16
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
相关资源
最近更新 更多