J'ai un morceau de code dans Ruby, ce qui se passe comme suit: peut-il être écrit comme p> ou dans un manière où je n'ai pas besoin de taper B code> deux fois. Ceci est hors de la paresse et j'aimerais savoir. P> p>
6 Réponses :
if [a, c].include? b # code end This is, however, significantly slower than the code you want to avoid -- at least as long as a, b and c are basic data. My measurements showed a factor of 3. This is probably due to the additional Array object creation. So you might have to weigh DRY against performance here. Normally it should not matter, though, because both variants do not take long.
Nice, mais c'est en fait 1 caractère plus longtemps, je suppose que cela dépend des noms de variables. At-il un impact sur la performance?
@zakinster :-) Compte de caractère n'était pas l'objectif de la question. Le point est plus pour éviter la répétition. Au lieu de B code> il pourrait y avoir quelque chose de plus complexe. Ou, lors de l'échange B code> par une autre variable, vous n'avez pas à le changer à deux endroits (moins d'erreurs).
Le nombre de caractères, ou d'espaces blancs, n'a qu'un effet marginal pendant l'interprète initial traversant le code. Après ce nombre de caractères est un non-problème. La modification d'algorithmes et de méthodes utilisées a un effet plus important sur la vitesse d'exécution.
@ La réponse de pourdur_gongor est parfaitement correcte. Juste pour ajouter cependant, si vous travaillez avec des tableaux, par exemple:
if [a,c].any?{ |i| (i&b).length == b.length }
# assuming that you're always working with arrays
end
# otherwise ..
if [a,c].any?{ |i| ([i].flatten&[b].flatten).length == [b].flatten.length }
# this'll handle objects other than arrays too.
end
Vous devriez vraiment savoir pourquoi cela ne fonctionne pas:
(a || c) == b
Bien que pas un équivalent exact de a == b || A == C CODE>, CASE CODE> Syntaxe de syntaxe pour ceci: case a
when b, c then true
else false end
Cela semble le moyen le plus rubyonique pour moi. propre et lisible! (Aussi, +1 pour le 42)
REMARQUE Ceci peut être généralisé et mis en œuvre de manière dynamique: arr = [b, c]; COS A; Quand * arrive alors ... code>.
Et ça? Si [a, c] .index (b)! = nil; met "b = a ou b = c"; fin p>
acolyte signalé que vous pouvez utiliser Une autre option consiste à utiliser un opérateur ternaire. p> b == (A || c) code>, vous venez de l'avoir en arrière, mais cela ne fonctionne que pour la valeur gauche, car (A || c) est toujours A, en supposant qu'on ne soit pas faux. a==b ? true : b==c
Quel était le problème avec
(a || c) == b code>? C'est en arrière de l'OMI, car je suggérerais d'essayer `b == (A || c) '(qui suit de meilleures conventions d'algèbre booléennes).@Acolyte Quoi de quoi le cas lorsque
A = 1 code>c = 0 code>b = 0 code>?@Ryanamos puis B == C, donc le conditionnel évalue à vrai. Sauf si Ruby ait une signification alternative pour
|| code>. Je suppose que cela se tenait pour logique ou.@acolyte
(A || c) code> ==> 11 == 0 code> ==> 0 d'autre part0 || 1 Code> ==> 1. Ceci suppose que les opérateurs booléens de C-C-liés fonctionnent de la même manière que les opérateurs booléens rubis. (pas un programmeur rubis)@Ryanamos hmmm, intéressant. Peut-être que je me suis trompé. C'est presque comme si nous avons besoin d'une sorte de sans logique ou. quelque chose pour dire essentiellement cela ou cela et ne pas évaluer pour la vérité. Sélection ou peut-être?
@acolyte
(A || c) code> estb code> sia code> est logique faux (c'est-à-direfaux code> ou < Code> nil code>) eta code> sinon.a, b, c = 1, 2, 2 code> conduirait à2 == (1 || 2) code> qui conduit à2 == 1 code > Qui est faux puisque tous les INT sont des valeurs véridaires dans RUBY et(A || B) CODE> choisira un si A est une vérité ou sinon, elle choisira B, quoi que ce soit.