+ @

2016-10-16 43 views
7

Bazı kod okuyordu yakut bir yöntem olarak ne anlama geliyor ve ben+ @

module M 
    def [email protected] 
    self 
    end 
end 

ben dosya üzerinde ruby -c çalıştırdığımda bu yasal sözdizimi şaşırdı, henüz çizgisinde bir şey gördü (yalan) geçerli olduğunu söyledi. [email protected] da yasal bir yöntem adıydı, ancak bu ikisi de yasadışı olan *@ veya [email protected]'u denediğimde. [email protected]'un ne anlama geldiğini ve neden yasal olduğunu merak ediyordum?

cevap

12

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.

+0

iyi bir açıklama, +1 –

1

yöntem adları [email protected] ve [email protected] tekli operatörleri Ruby + ve - aşırı için kullanılır (1.9+). Tekli operatörler, yalnızca tek bir değer alan işleçlerdir (ör. value = -value).