8
votes

Peut un "si (a == b || c == b)" est-il fait plus court en rubis

J'ai un morceau de code dans Ruby, ce qui se passe comme suit: xxx

peut-il être écrit comme xxx

ou dans un manière où je n'ai pas besoin de taper B deux fois. Ceci est hors de la paresse et j'aimerais savoir.


7 commentaires

Quel était le problème avec (a || c) == b ? 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 c = 0 b = 0 ?


@Ryanamos puis B == C, donc le conditionnel évalue à vrai. Sauf si Ruby ait une signification alternative pour || . Je suppose que cela se tenait pour logique ou.


@acolyte (A || c) ==> 1 1 == 0 ==> 0 d'autre part 0 || 1 ==> 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) est b si a est logique faux (c'est-à-dire faux ou < Code> nil ) et a sinon.


a, b, c = 1, 2, 2 conduirait à 2 == (1 || 2) qui conduit à 2 == 1 Qui est faux puisque tous les INT sont des valeurs véridaires dans RUBY et (A || B) choisira un si A est une vérité ou sinon, elle choisira B, quoi que ce soit.


6 Réponses :


20
votes
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.

3 commentaires

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 il pourrait y avoir quelque chose de plus complexe. Ou, lors de l'échange B 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.



0
votes

@ 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


0 commentaires

3
votes

Vous devriez vraiment savoir pourquoi cela ne fonctionne pas:

(a || c) == b


0 commentaires

6
votes

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


2 commentaires

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 ... .



-1
votes

Et ça? Si [a, c] .index (b)! = nil; met "b = a ou b = c"; fin


0 commentaires

-1
votes

acolyte signalé que vous pouvez utiliser 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.

Une autre option consiste à utiliser un opérateur ternaire. p>

a==b ? true : b==c


0 commentaires