139 Stimmen

Was bedeutet !! in Ruby?

Fragte mich nur, was !! in Ruby ist.

3voto

Micah Elliott Punkte 8404

Es ist "Doppel-Negation", aber die Praxis wird entmutigt. Wenn Sie rubocop verwenden, werden Sie sehen, dass es sich über einen solchen Code mit einem Verstoß gegen Style/DoubleNegation beschwert.

Die Begründung besagt:

Da dies sowohl kryptisch als auch in der Regel überflüssig ist, sollte es vermieden werden [dann in eigenen Worten:] Ändern Sie !!etwas zu !etwas.nil?

1 Stimmen

Aber... !!false # => false während !false.nil? # => true

0 Stimmen

@Doug Wenn Sie wissen, dass Sie einen booleschen Wert haben, ist es überflüssig (verwenden Sie einfach den Wert). Wenn nicht, können Sie !(foo.nil? || foo == false) verwenden - ausführlicher, ja, aber weniger kryptisch.

0voto

inopinatus Punkte 3140

Das Verstehen, wie es funktioniert, kann nützlich sein, wenn Sie beispielsweise eine Enumeration in ein Boolean umwandeln müssen. Ich habe Code, der genau das mit dem classy_enum Gem macht:

class LinkStatus < ClassyEnum::Base
  def !
    return true
  end
end

class LinkStatus::No < LinkStatus
end

class LinkStatus::Claimed < LinkStatus
  def !
    return false
  end
end

class LinkStatus::Confirmed < LinkStatus
  def !
    return false
  end
end

class LinkStatus::Denied < LinkStatus
end

Dann habe ich zum Beispiel im Service-Code:

raise Application::Error unless !!object.link_status   # => wirft eine Ausnahme für die Zustände "No" und "Denied".

Effektiv ist der Bangbang-Operator zu dem geworden, was ich sonst möglicherweise als eine Methode namens to_bool geschrieben hätte.

-1voto

Richard-Degenne Punkte 2758

Andere Antworten haben diskutiert, was !! macht und ob es eine gute Praxis ist oder nicht.

Keine der Antworten gibt jedoch den "Standardweg" in Ruby an, um einen Wert in einen Boolean zu casten.

true & variable

TrueClass, die Klasse des Ruby-Werts true, implementiert eine Methode &, die wie folgt dokumentiert ist:

Gibt false zurück, wenn obj nil oder false ist, andernfalls true.

Warum eine dreckige doppelte Verneinung verwenden, wenn die Standardbibliothek das abdeckt?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X