2017-02-19 4 views
3

私はRubyを学んでいますが、問題が発生しました。メソッドの最初のパラメータとしてhashを入れることはできますか?

これは私が書いたコードです。

class Customer 
    def puts_result(name, addr) 
    return name, addr 
    end 
end 

aaron = Customer.new 
puts aaron.puts_result "Aaron", {country: "Taiwan", city: "Tainan"} 
puts aaron.puts_result "Aaron", country: "Taiwan", city: "Tainan" 
puts aaron.puts_result {country: "Taiwan", city: "Tainan"}, "Aaron" 

私はputs_resultメソッドを呼び出し、3つの異なる方法でパラメータを渡します。

最初の方法では、中括弧でハッシュを渡しました。うまくいきます。 2番目の方法では、中括弧を使わずにハッシュを渡しました。

私が問題にしているのは3番目の方法ですが、中括弧で最初のパラメータとしてハッシュを渡しましたが、エラーが返されます。

(REPL):15:構文エラー、予期しない ':'、期待 '}' aaron.puts_result {国置く: "台湾"、市: "台南"}、 "アーロン" (REPL) :15:予期しない構文エラーは、 ''、期待は '}' aaron.puts_result {国置く: "台湾"、市: "台南" を}、 "アーロン"

は、何かが私の不注意ありますか?エラーがあなたの第三コール

ここ
puts aaron.puts_result {country: "Taiwan", city: "Tainan"}, "Aaron" 

にoccures

答えて

2

開く中括弧を解析するとき、構文あいまいさがあります。これは、ハッシュ(あなたが意図しているもの)の開始か、メソッドに渡されたブロックの開始のいずれかになります。

Rubyのパーサーは、引数を明示的なかっこで指定しない限り、メソッドの後ろにある中括弧はブロックの開始を知らせると常に仮定しています。ブロックが括弧の中で宣言されることはありませんが、常に外側に宣言されるので、これはあいまいさを解決します。次のようにあなたのコードでは

、あなたはこのようにあいまいさを解決することができます

puts aaron.puts_result({country: "Taiwan", city: "Tainan"}, "Aaron") 

をこのことから、反復ルールを取得するには:常に最初の引数は括弧付きリテラルハッシュのとき、メソッド呼び出しの周りparanthesisを使用することを忘れないでください。

+1

私はそれを得ました!非常に説明をありがとう。 – PJCHENder

関連する問題