2017-10-01 21 views
-1

* splatをパラメータから削除すると、関数は正常に動作します。しかし、それがそこにあるとき、機能は動作しません。どうして?それはarguments常にも特異値のために、配列になりますで、メソッドシグネチャを可変引数だ私のREPL(https://repl.it/LuY8/4)をパラメータでsplatを使用しているときに関数が機能しないのはなぜですか?

class Hash 
    def keys_of(*arguments) 
    new_array = [] 
    self.each do |key, value| 
     #puts arguments 
     #puts key 
     if value == arguments 
     new_array << key 
     end 
    end 
    new_array 
    end 
end 

animals = {"sugar glider"=>"Australia","aye-aye"=> "Madagascar","red-footed tortoise"=>"Panama","kangaroo"=> "Australia","tomato frog"=>"Madagascar","koala"=>"Australia"} 

animals.keys_of('Madagascar') 
+1

「動作しません」 – glennsl

+0

リンクを参照してください:https://repl.it/LuY8/4 – pigusan

答えて

2

参照してください。つまり、['Madagascar']argumentsとし、キーが1つの文字列の配列ではないため、一致が失敗します。あなたはおそらく欲しい

は、これを行うことにより、全体のルーチンを反転し、それがより多くのルビーのようにすることです:

def keys_of(*arguments) 
    each_with_object([ ]) do |(key, value), a| 
    a << key if (arguments.include?(value)) 
    end 
end 

問題は解決しました。 Rubyは非常に豊富で機能豊富なコアライブラリを持っており、Enumerableは本当の宝石です。自分の仕事に似た方法を書く前に、自分ができることを熟知してください。

+0

これは 'key' =>' value'( 'Hash#values_at')を処理しますが、OPは' value' => 'key'を好きにします – engineersmnky

+0

@engineersmnkyああ、あなたは正しい。私はそれを修正します。 – tadman

関連する問題