2017-11-09 15 views
-2

私は、Ruby上のrubyを使って子アプリケーションの動的ボタンをテストしようとしています。これは静的に行われる方法です。'new'内の配列をループする

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

誰でもこれを手助けできますか?

+0

'respond = parsed_response [" values "]。それぞれdo | val | ...... end''と ':responses => responses' - 一時変数を使います。 –

+0

@DaveSlutzkin 'x.each {...}'が 'x'を返すことを除いて。 –

+0

@muistooshort ...途中で途切れていた場合を除いて 'break y' :) – mudasobwa

答えて

1

私はあなたがEnumerable#mapを探していると思う:

マップ{|をobj |ブロックは}→配列
[...]
列挙内のすべての要素に対して一度ブロックを実行した結果を使用して新しい配列を返します。あなたのケースでは

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 
) 

かさえ:このようなあなたのコードに追加することができます

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) 
) 

とコードのノイズが少ないです。