循环遍历'new'中的数组

时间:2017-11-09 02:44:53

标签: ruby

我正在尝试使用ruby on rails gem Rubychy来测试子应用程序的动态按钮。这是静态完成的方式:

keyboard = Rubychy::DataTypes::Keyboard.new(
  :to => 'myname',
  :hidden => false,
  :responses => [
    Rubychy::DataTypes::KeyboardResponse.new(
      type: "text",
      body: blah,
    ),
    Rubychy::DataTypes::KeyboardResponse.new(
      type: "text",
      body: blah1,
    )
  ]
)

响应是预定义的。我需要遍历一个数组并每次调用Rubychy::DataTypes::KeyboardResponse.new()。虽然这非常不正确,但它显示了我需要循环的内容。

我尝试了不同的方法来做到这一点,我每次都被抓住了。

keyboard = Rubychy::DataTypes::Keyboard.new(
  :to => 'myname',
  :hidden => false,
  :responses => [
    parsed_response["values"].each do |val|
      Rubychy::DataTypes::KeyboardResponse.new(
        type: "text",
        body: val.name,
      )
    end
  ]
)

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

我认为您正在寻找Enumerable#map

  

映射{| obj | block}→array
  [...]
  为 enum 中的每个元素返回一个新数组,其中包含运行 block 的结果。

在你的情况下:

parsed_response['values'].map do |val|
  Rubychy::DataTypes::KeyboardResponse.new(
     type: "text",
     body: val.name,
  )
end

可以像这样添加到您的代码中:

keyboard = Rubychy::DataTypes::Keyboard.new(
  :to => 'myname',
  :hidden => false,
  :responses => parsed_response["values"].map do |val|
    Rubychy::DataTypes::KeyboardResponse.new(
      type: "text",
      body: val.name,
    )
  end
)

甚至:

to_response = ->(val) do
   Rubychy::DataTypes::KeyboardResponse.new(
     type: "text",
     body: val.name,
   )
end
keyboard = Rubychy::DataTypes::Keyboard.new(
  :to => 'myname',
  :hidden => false,
  :responses => parsed_response["values"].map(&to_response)
)

使逻辑更清晰,代码更少噪音。