Fragte mich nur, was !!
in Ruby ist.
Aber... !!false # => false
während !false.nil? # => true
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?
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.
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, wennobj
nil
oderfalse
ist, andernfallstrue
.
Warum eine dreckige doppelte Verneinung verwenden, wenn die Standardbibliothek das abdeckt?
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.