Rubyは+
、-
、!
、~
、&
と*
を含むいくつかの単項演算子が含まれています。他の演算子と同様に、これらを再定義することもできます。 と!
については、def ~
とdef !
とは、バイナリの対応がないため(例:a!b
と言うことはできません)、単純に言うことができます。
しかし-
と+
ため単項、バイナリバージョン(例えばa+b
と+a
が両方とも有効である)の両方がありますので、あなたは、あなたがdef [email protected]
とdef [email protected]
を使用する必要が単項バージョンを再定義したい場合。
*
と&
の単項バージョンもありますが、それらは特別な意味を持っています。 *
の場合は配列のスプラットに縛られ、&
はオブジェクトを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
は通常同じことを意味します)。どのクラスでも混在させると、クラスはunary plus演算子の使用をすぐにサポートします。この例では、あなたが[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 –