2016-10-16 6 views
7

のメソッドとして何を意味し、私は私は、これは法的な構文だったことに驚きました、まだ私は、ファイルに<code>ruby -c</code>を実行したときに+ @私はいくつかのコードを読んでいたルビー

module M 
    def [email protected] 
    self 
    end 
end 

の線に沿って何かを見ました(lintに)それはそれが有効であったと言った。 [email protected]も法的なメソッド名でしたが、*@または[email protected]の両方が違法でした。私は[email protected]が何を意味し、なぜそれが合法であるのだろうと思っていましたか?

答えて

12

Rubyは+-!~&*を含むいくつかの単項演算子が含まれています。他の演算子と同様に、これらを再定義することもできます。 と!については、def ~def !とは、バイナリの対応がないため(例:a!bと言うことはできません)、単純に言うことができます。

しかし-+ため単項、バイナリバージョン(例えばa+b+aが両方とも有効である)の両方がありますので、あなたは、あなたがdef [email protected]def [email protected]を使用する必要が単項バージョンを再定義したい場合。

*&の単項バージョンもありますが、それらは特別な意味を持っています。 *の場合は配列のスプラットに縛られ、&はオブジェクトを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は通常同じことを意味します)。どのクラスでも混在させると、クラスは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とは異なります。

+0

まともな説明、+1 –

1

メソッド名[email protected][email protected]は、単項演算子+-をRuby(1.9+)にオーバーロードするために使用されます。 単項演算子は、単一の値のみを取る演算子です(例:value = -value)。

関連する問題

 関連する問題