0

このコードがあるとしましょう:

def something(*someargs)
      return *someargs.join(",")
end

ここで、メソッド定義内の他の変数と同じように *someargs を参照できることがわかりました。しかし、私はこれを試しました...コンマで区切られた文字列として *someargs を返します。それでも、このメソッドを呼び出すと:

a = something(4, 5)
p a.class # => Array
p a #> ["4,5"]

something(4,5) がまだ配列を返すのはなぜですか? 私がこのようなことをすると:

[4, 5].join(",")

結果は配列にない文字列になります。したがって、私の質問は、「何か」メソッドがすべての引数を文字列として含む実際の文字列を返すようにするにはどうすればよいかということです。*someargs.class を実行すると、結果は「配列」になりますが、通常の配列のように動作しないため、奇妙です...

4

2 に答える 2

2

以下を試してください:

def something(*someargs)
      return someargs.join(",")
end
a = something(4, 5)

p a.class # => String
p a # => "4,5"

あなたのケースを説明する一例:

a = *"12,11"
p a # => ["12,11"]

だから、あなたがしたとき、文字列を として作成return *someargs.join(",")しました。だから最終的にあなたは得ています。someargs.join(",")"4,5""4,5"a = *"4,5"["4,5"]

スプラット オペレーターを使用したその他のシナリオについては、こちらをご覧ください -Splat Operator in Ruby

それが役立つことを願っています。

于 2013-10-30T13:00:38.380 に答える
-3
  • 頭に感嘆符が付いたオブジェクト*...はオブジェクトではありません。そのようなものを参照することはできません。また、そのようなものがないため、メソッドに引数として渡すこともできません。ただし、たとえばputs、複数の引数を取ることができるメソッドがある場合は、次のようにすることができます。

    puts *["foo", "bar"]
    

    この場合、 などはありません*["foo", "bar"]。splat 演算子はそれを複数の引数に展開しています。以下と同等です。

    puts "foo", "bar"
    
  • someargsの後に配列のままである理由についてsomeargs.join(",")。それはjoin破壊的な方法ではないからです。受信者には何もしません。さらに、オブジェクトは破壊的な方法でそのクラスを変更することはできません。someargsの参照を配列から文字列に変更する唯一の方法は、再割り当てすることです。

于 2013-10-30T13:40:31.293 に答える