2010-07-30 1 views

Répondre

1
class Array 
    def to_hash; Hash[*map {|x| [x, yield(x)] }.flatten]; end 
end 

(Edit) Voici une version plus détaillée:

class Array 
    def to_hash 
    keys_and_values = self.map {|x| [x, yield(x)] } 
    # Now `keys_and_values` is an array of arrays reperesenting 
    # the hash. If the array this method was called on was, for 
    # example, `[1, 2, 3]`, and the block passed to this method 
    # was `{|x| x + 1 }`, `keys_and_values` would be: 
    # 
    #  [[1, 2], [2, 3], [3, 4]] 


    keys_and_values = keys_and_values.flatten 
    # now `keys_and_values` still contains all of the keys/values 
    # of the new hash, but without the inner arrays. Even numbered 
    # indexes will be keys, and odd indexes will be values. Example: 
    # 
    #  [1, 2, 2, 3, 3, 4] 


    Hash[*keys_and_values] 
    # This returns the keys/values translated to a hash. The docs 
    # for the `Hash.[]` method is here: 
    # 
    #  http://ruby-doc.org/core/classes/Hash.html#M002839 
    end 
end 
+0

Wow, il semble très geek! Je suis désolé mais je ne peux pas comprendre ce code. Que se passe-t-il? Si possible, j'aimerais lire un long code de ceci. Et j'ai essayé d'utiliser ce code avec le suivant. Est-ce bon usage? ["abc", "def", "ghi"]. To_hash {| i | "même"} # => {"abc" => "même", "def" => "même", "ghi" => "même"} Merci. – bekkou68

+0

@ bekkou68: Voir mon edit, qui l'explique. – Adrian

9

Une fonction qui vérifie si un nombre entier n est premier en utilisant regex!

def is_prime(n) 
    ("1" * n) !~ /^1?$|^(11+?)\1+$/ 
end 

Explication et source here.

+0

Il suffit de lire l'explication. Je dois remettre ça encore une fois. – Eimantas

+0

Wow, c'est puissant et beau! Et merci d'avoir mis la référence. – bekkou68

+0

Il est aussi plus vieux que rubis. Je suis à peu près sûr que cette regex est apparue pour la première fois dans l'une des sigs d'Abigail dans le nouveau groupe comp.lang.perl.misc dans les années 90. –

0

utilisant enum.zip et bloc:

class Array 
    def to_hash(&b) 
    Hash[*self.zip([b.call]*self.size).flatten] 
    end 
end 
#[1,2,3].to_hash{'n'} >> {1=>'n',2=>'n',3=>'n'} 
Questions connexes