2016-10-16 5 views
7

내가 몇 가지 코드를 읽고 있었다 루비의 방법으로 무엇을 의미합니까 내가은 + @

module M 
    def [email protected] 
    self 
    end 
end 

내가 파일에 ruby -c을 실행했을 때 나는이 법적 구문 것을 놀랐습니다, 아직의 라인을 따라 뭔가를 보았다 (보푸라기에) 그것은 그것이 유효하다고 말했다. [email protected]도 합법적 인 이름이었습니다. *@ 또는 [email protected] 두 가지 모두 불법입니다. 나는 무엇이 [email protected] 의미하고 왜 그것이 합법적인지 궁금 해서요?

답변

12

루비 +, -, !, ~, &*을 포함하여 몇 단항 연산자가 포함되어 있습니다. 다른 연산자와 마찬가지로이 연산자를 재정의 할 수도 있습니다. 과 !의 경우 def ~def !은 이진 파일이 없기 때문에 (예 : a!b) 말할 수 있습니다. 당신은 당신이 def [email protected]def [email protected]를 사용할 필요가 단항 버전을 재정의 할, 그래서 만약

-위한 그러나

+는 모두 단항 및 바이너리 버전이 (예를 들어, a+b+a는 모두 유효)된다.

*&의 단항 버전도 있지만 특별한 의미가 있습니다. *의 경우 배열을 splatting해야하며 &의 경우 개체를 proc로 변환해야하므로 사용하려면 to_ato_proc을 각각 다시 정의해야합니다. 당신의 예에서

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 :("] 

모듈은 단지 개체와 아무것도 안하고 기본값와 더불어, 단항 + 연산자를 정의 (: 여기

모든 단항 연산자의 종류를 보여주는보다 완벽한 예입니다 이는 단항 플러스의 일반적인 동작 인 5+5은 일반적으로 같은 의미입니다. 어떤 클래스와 섞여도 클래스는 단항 더하기 연산자를 사용하여 즉시 지원을 받는다는 것을 의미합니다. 이 예에서 당신이 [email protected] 방법은

참고 위의 예는 그 클래스에서 누락 된 오류 메시지에서 분명히 볼 수

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" 

참고 : 예를 들어 (루비 <=2.2 사용)

그 버전 이후로 단항 마이너스와 플러스가 문자열에 대해 정의되어 있으며, 원래와 동결되지 않은 문자열을 반환하는 것을 가리키는 Ruby 2.3과 다릅니다.

+0

괜찮은 설명, +1 –

1

방법 이름 및 [email protected][email protected]는 단항 연산자 루비 +- 과부하하는데 사용된다 (1.9+). 단항 연산자는 하나의 값만 취하는 연산자입니다 (예 : value = -value).