루비 +
, -
, !
, ~
, &
및 *
을 포함하여 몇 단항 연산자가 포함되어 있습니다. 다른 연산자와 마찬가지로이 연산자를 재정의 할 수도 있습니다. 과 !
의 경우 def ~
과 def !
은 이진 파일이 없기 때문에 (예 : a!b
) 말할 수 있습니다. 당신은 당신이 def [email protected]
및 def [email protected]
를 사용할 필요가 단항 버전을 재정의 할, 그래서 만약
-
위한 그러나
및 +
는 모두 단항 및 바이너리 버전이 (예를 들어, a+b
및 +a
는 모두 유효)된다.
*
과 &
의 단항 버전도 있지만 특별한 의미가 있습니다. *
의 경우 배열을 splatting해야하며 &
의 경우 개체를 proc로 변환해야하므로 사용하려면 to_a
및 to_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과 다릅니다.
괜찮은 설명, +1 –