Der Zweck einer Klasse besteht darin, ähnliche Objekte oder Objekte mit ähnlichem Verhalten zu gruppieren. 1
und 2
sind sehr ähnlich, daher ist es vollkommen sinnvoll, dass sie in derselben Klasse sind. true
und sind false
jedoch nicht ähnlich. In der Tat ist ihr springender Punkt, dass sie genau das Gegenteil voneinander sind und ein entgegengesetztes Verhalten haben. Daher gehören sie nicht zur selben Klasse.
Können Sie ein Beispiel dafür geben, welche Art von allgemeinem Verhalten Sie in einer Boolean
Klasse implementieren würden ? Mir fällt nichts ein.
Schauen wir uns das Verhalten an TrueClass
und FalseClass
haben: Es gibt genau vier Methoden. Nicht mehr. Und in jedem Einzelfall machen die beiden Methoden genau das Gegenteil . Wie und warum würden Sie das in eine einzelne Klasse einordnen?
So implementieren Sie all diese Methoden:
class TrueClass
def &(other)
other
end
def |(_)
self
end
def ^(other)
!other
end
def to_s
'true'
end
end
Und jetzt umgekehrt:
class FalseClass
def &(_)
self
end
def |(other)
other
end
def ^(other)
other
end
def to_s
'false'
end
end
Zugegeben, in Ruby gibt es eine Menge "Magie", die sich hinter den Kulissen abspielt und die nicht wirklich von dem Dolmetscher gehandhabt TrueClass
und FalseClass
vielmehr fest verdrahtet wird. Sachen wie if
, &&
, ||
und !
. In Smalltalk, von dem Ruby viel geliehen hat, einschließlich des Konzepts von FalseClass
und TrueClass
, werden all diese Methoden ebenfalls als Methoden implementiert, und Sie können dasselbe in Ruby tun:
class TrueClass
def if
yield
end
def ifelse(then_branch=->{}, _=nil)
then_branch.()
end
def unless
end
def unlesselse(_=nil, else_branch=->{})
ifelse(else_branch, _)
end
def and
yield
end
def or
self
end
def not
false
end
end
Und wieder umgekehrt:
class FalseClass
def if
end
def ifelse(_=nil, else_branch=->{})
else_branch.()
end
def unless
yield
end
def unlesselse(unless_branch=->{}, _=nil)
ifelse(_, unless_branch)
end
def and
self
end
def or
yield
end
def not
true
end
end
Vor ein paar Jahren habe ich das oben genannte nur zum Spaß geschrieben und sogar veröffentlicht . Abgesehen von der Tatsache, dass die Syntax anders aussieht, weil Ruby spezielle Operatoren verwendet, während ich nur Methoden verwende, verhält es sich genau wie die eingebauten Operatoren von Ruby. Tatsächlich habe ich die RubySpec-Konformitätstestsuite übernommen und auf meine Syntax portiert, und sie besteht.
Boolean
?