Ich habe zwei Vorschläge für Sie, sind sie nicht sehr ideal, aber sie sind das Beste, was ich mir vorstellen kann.
Zuerst können Sie eine neue Methode für die Range-Klasse definieren, die das ausführt, was Sie beschreiben. Es würde wie folgt aussehen:
class Range
def have?(x)
if x == self.begin
false
else
include?(x)
end
end
end
p (0..10).have?(0) #=> false
p (0..10).have?(0.00001) #=> true
Ich weiß nicht, habe ich nur ein Synonym für „include“ als Methode Namen, vielleicht können Sie besser etwas denken. Aber das ist die Idee.
Und dann könnten Sie etwas aufwendigeres tun, und definieren Sie eine Methode für die Range-Klasse, die einen Bereich als eine, die Sie den Anfangswert von ausschließen möchten, und ändern Sie dann Bereich include?
Methode, um nach dieser Marke zu überprüfen.
class Range
def exclude_begin
@exclude_begin = true
self
end
alias_method :original_include?, :include?
def include?(x)
return false if x == self.begin && instance_variable_defined?(:@exclude_begin)
original_include?(x)
end
alias_method :===, :include?
alias_method :member?, :include?
end
p (0..10).include?(0) #=> true
p (0..10).include?(0.00001) #=> true
p (0..10).exclude_begin.include?(0) #=> false
p (0..10).exclude_begin.include?(0.00001) #=> true
Auch hier können Sie ein besseres wollen (elegantere?) Namen für die Methode als exclude_begin
, entschied ich mich nur, dass da es im Einklang mit der Reichweite exclude_end?
Methode.
Bearbeiten: Ich habe eine andere für Sie, nur weil ich dieses Problem so interessant finde. : P Dies wird funktionieren nur in der neuesten Version von Ruby 1.9, aber die folgende Syntax erlauben:
(0.exclude..10).include? 0 #=> false
(0.exclude..10).include? 0.00001 #=> true
Es nutzt die gleiche Idee wie mein zweiter Vorschlag, aber speichert den „Ausschluss-Marker“ in der Zahl anstelle der Reichweite. Ich muss den SimpleDelegator von Ruby 1.9 verwenden, um dies zu erreichen (Zahlen allein können keine Instanzvariablen haben oder irgendetwas), weshalb es in früheren Versionen von Ruby nicht funktioniert.
Ich denke, dass das Ausschließen des letzten Werts oft ziemlich nützlich ist, wie 'range = 0 ... something.size' Was ist Ihr Anwendungsfall, den _first_ Wert ausschließen zu müssen? –
Ich überprüfe, ob ein bestimmter Satz von Werten in diesem Bereich liegt. Ich möchte nur Nullwerte anders behandeln. Ich weiß, wie man das erreicht, aber ich war neugierig, ob es etwas ähnliches wie '...' gibt, um den * ersten * Wert eines Bereichs auszuschließen. –
Ich habe in 5 Minuten mehr über die Reichweite erfahren als im letzten Jahr. Vielen Dank! –