Yakut +
, -
, !
, ~
, &
ve *
dahil olmak üzere birkaç tekli operatörler içerir. Diğer operatörler gibi, bunları da yeniden tanımlayabilirsiniz. ~
ve !
için, sadece bir ikili karşılığı olmayan (örneğin, a!b
diyemezsiniz) def ~
ve def !
deyin. Eğer def [email protected]
ve def [email protected]
kullanmak zorunda tekli versiyonu yeniden tanımlamak istiyorsanız böylece
-
Ancak
ve +
hem tekli ve ikili versiyonu var (örn a+b
ve +a
hem geçerlidir) olduğunu. Ayrıca, *
ve &
'un tekil bir sürümü olduğunu, ancak özel anlamları olduğu da not edilir. *
için diziyi splattinge bağlanır ve &
için, nesneyi bir proc'ye dönüştürmek için bağlanır, böylece onları kullanmak isterseniz, sırasıyla to_a
ve to_proc
yeniden tanımlamanız gerekir. Örnekte
class SmileyString < String
def [email protected]
SmileyString.new(self + " :)")
end
def [email protected]
SmileyString.new(self + " :(")
end
def ~
SmileyString.new(self + " :~")
end
def !
SmileyString.new(self + " :!")
end
def to_proc
Proc.new { |a| SmileyString.new(self + " " + a) }
end
def to_a
[SmileyString.new(":("), self]
end
end
a = SmileyString.new("Hello")
p +a # => "Hello :)"
p ~a # => "Hello :~"
p *a # => [":(", "Hello"]
p !a # => "Hello :!"
p +~a # => "Hello :~ :)"
p *+!-~a # => [":(", "Hello :~ :(:! :)"]
p %w{:) :(}.map &a # => ["Hello :)", "Hello :("]
Modülü sadece basit bir nesneyle hiçbir şey yapmıyor varsayılan değeri ile, bir tekli + operatörünü tanımlar (: İşte
tüm tekli operatörlerden türlü gösteren daha tam örnektir Bu, unary plus için ortak bir davranıştır,
5
ve
+5
genellikle aynı şeyi ifade eder). Herhangi bir sınıfla karıştırmak, sınıfın hemen hemen hiçbir şey yapmadan teklik artı operatörünü kullanmak için destek alması anlamına gelir. Bu örnekte sen
[email protected]
yöntem
Not Yukarıdaki örnek bu sınıfın eksik hata mesajından rahatlıkla görebilir ki
module M
def [email protected]
self
end
end
p +"Hello" # => NoMethodError: undefined method `[email protected]' for "Hello":String
class String
include M
end
p +"Hello" # => "Hello"
Not: Örneğin (yakut <=2.2
kullanarak)
Ruby 2.3'ten farklı olacaktır, çünkü bu sürümden itibaren Uncut'ler için eksi ve artılar tanımlanmıştır ve donmuş ve donmamış bir dizgeyi orijinalden döndürmeye atıfta bulunurlar.
iyi bir açıklama, +1 –