Poursuivant le meme "Fonctionnalités cachées de ...", partageons les fonctionnalités moins connues mais utiles du langage de programmation Ruby.
Essayez de limiter cette discussion avec le noyau Ruby, sans aucun élément Ruby on Rails.
Voir également:
- Fonctionnalités cachées de C #
- Fonctionnalités cachées de Java
- Fonctionnalités cachées de JavaScript
- Fonctionnalités cachées de Ruby on Rails
- Fonctionnalités cachées de Python
(S'il vous plaît, une seule fonction cachée par réponse.)
Je vous remercie
ruby
hidden-features
squadette
la source
la source
Réponses:
De Ruby 1.9 Proc # === est un alias de l'appel Proc #, ce qui signifie que les objets Proc peuvent être utilisés dans des instructions case comme ceci:
la source
Peter Cooper a une bonne liste de trucs Ruby. Peut-être que mon préféré est de permettre à la fois des articles uniques et des collections d'être énumérés. (Autrement dit, traitez un objet non-collection comme une collection contenant uniquement cet objet.) Cela ressemble à ceci:
la source
items
est une chaîne, vous n'avez pas à la mettre entre [*…]. String.each n'itère pas les caractères comme certains peuvent s'y attendre. Il revient simplement au bloc.Je ne sais pas à quel point cela est caché, mais je l'ai trouvé utile lorsque j'ai besoin de créer un hachage à partir d'un tableau unidimensionnel:
la source
Hash[ [["apple","red"], ["banana","yellow"] ]
produit le même résultat.Une astuce que j'aime est d'utiliser l'
*
expanseur splat ( ) sur des objets autres que des tableaux. Voici un exemple de correspondance d'expression régulière:D'autres exemples incluent:
la source
text, number = *"text 555".match(/regexp/)[1..-1]
.text, number = "Something 981".scan(/([A-z]*) ([0-9]*)/).flatten.map{|m| Integer(m) rescue m}
Wow, personne n'a mentionné l'opérateur de bascule:
la source
i == 3
et passe à faux aprèsi != 3
eti == 15
. Similaire à une bascule: en.wikipedia.org/wiki/Flip-flop_%28electronics%29Une des choses intéressantes à propos de ruby est que vous pouvez appeler des méthodes et exécuter du code dans des endroits où d'autres langages seraient désapprouvés, comme dans les définitions de méthode ou de classe.
Par exemple, pour créer une classe qui a une superclasse inconnue jusqu'à l'exécution, c'est-à-dire qu'elle est aléatoire, vous pouvez faire ce qui suit:
Cela utilise la
Array#sample
méthode 1.9 (en 1.8.7 uniquement, voirArray#choice
), et l'exemple est assez artificiel mais vous pouvez voir la puissance ici.Un autre exemple intéressant est la possibilité de mettre des valeurs de paramètres par défaut qui ne sont pas fixes (comme le demandent souvent d'autres langues):
Bien sûr, le problème avec le premier exemple est qu'il est évalué au moment de la définition, pas au moment de l'appel. Ainsi, une fois qu'une superclasse a été choisie, elle reste cette superclasse pour le reste du programme.
Cependant, dans le deuxième exemple, chaque fois que vous appelez
do_something_at
, laat
variable sera l'heure à laquelle la méthode a été appelée (enfin, très très proche de celle-ci)la source
require 'activesupport'
Une autre petite fonctionnalité - convertir un
Fixnum
en n'importe quelle base jusqu'à 36:Et comme Huw Walters l'a commenté, la conversion dans l'autre sens est tout aussi simple:
la source
String#to_s(base)
peut être utilisé pour reconvertir en un entier;"1001001100101100000001011010010".to_i(2)
,"499602d2".to_i(16)
etc. tous renvoient l'originalFixnum
.Hashes avec des valeurs par défaut! Un tableau dans ce cas.
Très utile en métaprogrammation.
la source
Téléchargez la source et le problème de Ruby 1.9
make golf
, puis vous pouvez faire des choses comme ceci:Lisez le
golf_prelude.c
pour des choses plus soignées qui se cachent.la source
Un autre ajout amusant dans la fonctionnalité 1.9 Proc est Proc # curry qui vous permet de transformer un Proc acceptant n arguments en un acceptant n-1. Ici, il est combiné avec le conseil Proc # === que j'ai mentionné ci-dessus:
la source
Opérateurs booléens sur des valeurs non booléennes.
&&
et||
Les deux renvoient la valeur de la dernière expression évaluée.
C'est pourquoi le
||=
mettra à jour la variable avec l'expression de valeur renvoyée sur le côté droit si la variable n'est pas définie. Ceci n'est pas explicitement documenté, mais bien connu.Cependant, ce
&&=
n'est pas si largement connu.est équivalent à
C'est très pratique pour les opérations destructives qui ne devraient pas se poursuivre si la variable n'est pas définie.
la source
string &&= string + "suffix"
équivaut àstring = string && string + "suffix"
. Cela&&
et||
retourner leur deuxième argument est discuté dans le PickAx, p. 154 (Partie I - Facettes de Ruby, expressions, exécution conditionnelle).La fonction Symbol # to_proc fournie par Rails est vraiment cool.
Au lieu de
Tu peux écrire:
la source
require 'activesupport'
car c'est en fait de là que viennent la plupart de ces assistants.Un dernier - dans ruby, vous pouvez utiliser n'importe quel caractère que vous souhaitez délimiter des chaînes. Prenez le code suivant:
Si vous ne souhaitez pas échapper les guillemets doubles dans la chaîne, vous pouvez simplement utiliser un séparateur différent:
En plus d'éviter d'avoir à échapper des délimiteurs, vous pouvez utiliser ces délimiteurs pour des chaînes multilignes plus agréables:
la source
Je trouve que l'utilisation de la commande define_method pour générer dynamiquement des méthodes est assez intéressante et moins connue. Par exemple:
Le code ci-dessus utilise la commande 'define_method' pour créer dynamiquement les méthodes "press1" à "press9". Plutôt que de taper les 10 méthodes qui contiennent essentiellement le même code, la commande define method est utilisée pour générer ces méthodes à la volée si nécessaire.
la source
Utilisez un objet Range comme une liste paresseuse infinie:
Plus d'infos ici: http://banisterfiend.wordpress.com/2009/10/02/wtf-infinite-ranges-in-ruby/
la source
module_function
Les méthodes de module qui sont déclarées comme module_function créeront des copies d'elles-mêmes en tant que méthodes d'instance privée dans la classe qui inclut le module:
Si vous utilisez module_function sans aucun argument, alors toutes les méthodes de module qui viennent après l'instruction module_function deviendront automatiquement module_functions elles-mêmes.
la source
module_function
(2ème façon) est d'utiliser simplementextend self
(ce qui est plutôt sympa: D)Injecter court, comme tel:
Somme de la plage:
la source
require 'backports'
:-)Attention: cet objet a été élu n ° 1 du hack le plus horrible de 2008 , donc à utiliser avec précaution. En fait, évitez-le comme la peste, mais c'est très certainement du rubis caché.
Superators ajoutent de nouveaux opérateurs à Ruby
Vous avez toujours voulu un opérateur de prise de contact super secret pour une opération unique dans votre code? Vous aimez jouer au golf codé? Essayez des opérateurs comme - ~ + ~ - ou <--- Ce dernier est utilisé dans les exemples pour inverser l'ordre d'un élément.
Je n'ai rien à voir avec le projet Superators à part l' admirer.
la source
Je suis en retard à la fête, mais:
Vous pouvez facilement prendre deux tableaux de longueur égale et les transformer en hachage avec un tableau fournissant les clés et l'autre les valeurs:
(Cela fonctionne car Array # zip "zippe" les valeurs des deux tableaux:
Et Hash [] peut prendre un tel tableau. J'ai vu des gens faire ça aussi:
Ce qui donne le même résultat, mais le splat et l'aplatissement sont totalement inutiles - peut-être qu'ils ne l'étaient pas dans le passé?)
la source
Hashs auto-vivifiants en Ruby
Cela peut être très pratique.
la source
module InfHash; def self.new; Hash.new {|h,k| h[k] = Hash.new(&h.default_proc)}; end; end
Destructuration d'un tableau
Où:
En utilisant cette technique, nous pouvons utiliser une affectation simple pour obtenir les valeurs exactes que nous voulons d'un tableau imbriqué de n'importe quelle profondeur.
la source
Class.new()
Créez une nouvelle classe au moment de l'exécution. L'argument peut être une classe à dériver, et le bloc est le corps de la classe. Vous voudrez peut-être aussi regarder
const_set/const_get/const_defined?
pour que votre nouvelle classe soit correctement enregistrée, afin qu'elleinspect
imprime un nom au lieu d'un numéro.Ce n'est pas quelque chose dont vous avez besoin tous les jours, mais tout à fait pratique lorsque vous le faites.
la source
MyClass = Class.new Array do; def hi; 'hi'; end; end
semble être équivalent àclass MyClass < Array; def hi; 'hi'; end; end
.créer un tableau de nombres consécutifs:
définit x sur [0, 1, 2, 3, 4, 5]
la source
*
opérateur splat ( ) appelle deto_a
toute façon.Une grande partie de la magie que vous voyez dans Rubyland a à voir avec la métaprogrammation, qui consiste simplement à écrire du code qui écrit du code pour vous. Ruby
attr_accessor
,attr_reader
etattr_writer
sont tous metaprogramming simples dans la mesure où ils créent deux méthodes dans une ligne, suivant un modèle standard. Rails fait beaucoup de métaprogrammation avec ses méthodes de gestion des relations commehas_one
etbelongs_to
.Mais c'est assez simple de créer vos propres astuces de métaprogrammation en utilisant
class_eval
pour exécuter du code écrit dynamiquement.L'exemple suivant permet à un objet wrapper de transmettre certaines méthodes à un objet interne:
La méthode
Wrapper.forwards
prend des symboles pour les noms des méthodes et les stocke dans lemethods
tableau. Ensuite, pour chacun de ceux donnés, nous utilisonsdefine_method
pour créer une nouvelle méthode dont le travail est d'envoyer le message, y compris tous les arguments et blocs.Une excellente ressource pour les problèmes de métaprogrammation est Why the Lucky Stiff "Seeing Metaprogramming Clearly" .
la source
utilisez tout ce qui répond à
===(obj)
des comparaisons de cas:Module
(et doncClass
)Regexp
,Date
et bien d' autres classes définissent une méthode d'instance: === (autre), et peuvent tous être utilisés.Merci à Farrel pour le rappel d'
Proc#call
être aliasé commeProc#===
dans Ruby 1.9.la source
Le binaire "ruby" (au moins les IRM) supporte un grand nombre de commutateurs qui ont rendu les one-liners perl très populaires.
Les plus importants:
put
s automatique à la fin de chaque itération de boucleQuelques exemples:
N'hésitez pas à chercher sur Google "ruby one-liners" et "perl one-liners" pour des tonnes d'exemples pratiques et utilisables supplémentaires. Il vous permet essentiellement d'utiliser ruby comme un remplacement assez puissant de awk et sed.
la source
La méthode send () est une méthode à usage général qui peut être utilisée sur n'importe quelle classe ou objet de Ruby. S'il n'est pas remplacé, send () accepte une chaîne et appelle le nom de la méthode dont il est passé. Par exemple, si l'utilisateur clique sur le bouton «Clr», la chaîne «press_clear» sera envoyée à la méthode send () et la méthode «press_clear» sera appelée. La méthode send () permet une manière amusante et dynamique d'appeler des fonctions dans Ruby.
Je parle plus de cette fonctionnalité dans Blogging Shoes: L'application Simple-Calc
la source
Tromper une classe ou un module en disant qu'il a exigé quelque chose qu'il n'a pas vraiment requis:
Ceci est utile par exemple lorsque vous demandez A qui à son tour nécessite B mais nous n'avons pas besoin de B dans notre code (et A ne l'utilisera pas non plus via notre code):
Par exemple, Backgroundrb's
bdrb_test_helper requires
'test/spec'
, mais vous ne l'utilisez pas du tout, donc dans votre code:la source
Fixnum#to_s(base)
peut être vraiment utile dans certains cas. Un tel cas est la génération de jetons uniques aléatoires (pseudo) en convertissant un nombre aléatoire en chaîne en utilisant la base de 36.Jeton de longueur 8:
Jeton de longueur 6:
la source
Définir une méthode qui accepte n'importe quel nombre de paramètres et les ignore tous
La
hello
méthode ci-dessus n'a besoin que d'être affichée àputs
"hello"
l'écran et d'appelersuper
- mais comme la superclassehello
définit les paramètres, elle doit également le faire - mais comme elle n'a pas réellement besoin d'utiliser les paramètres elle-même, elle n'a pas besoin de leur donner un nom.la source