2012-01-12 6 views
1

object.functionName構文を使用して呼び出し可能なコアRubyメソッドのみですか?ドット構文で呼び出し可能なメソッドを自分で作成することは可能ですか?この方法についてはドットシンタックスとパラメータ渡しシンタックス

:作品以下

def namechanger (name) 

    nametochange = name 
    puts "This is the name to change: #{nametochange}" 

end 

第1、第二にはありません。

namechanger("Steve") 

"Steve".namechanger 

私は"Steve".namechanger

上のエラー、エラーがある取得:

rb:21:in `<main>': private method `namechanger' called for "Steve":String (NoMethodError) 
+0

さて、問題はどのような*エラーメッセージ*頼みますか?そして**それはなぜ理にかなっているのですか?あなたがRubyで "クラスを開く"ことができますが、これも汚染の原因になります。おそらく、あなたは 'Person.new(" Steve ")change_name(" Fred ")'のようなパターンに従いたいと思っていますか? –

+0

エラーを追加しました。ありがとうございました – holaSenor

+0

'obj.m' *は*常に"受信者 'obj'にメッセージ" m "を送ることを意味しています。これはRubyでは' "x"を作る唯一の方法です。 '' x "'を有効にすることです。 'String'、' m'に応答します。 (いくつかの他の言語では、受信者または受信者の親を変更せずに過負荷を作成することができます) –

答えて

3

はい、あなたは所望の効果を達成するためにStringクラスにメソッドを追加することができます。変数「self」は、メソッド呼び出しを受け取るオブジェクトを参照します。

class String 
    def namechanger 
    "This is the name to change: #{self}" 
    end 
end 
"Steve".namechanger # => This is the name to change: Steve 

この方法はmonkey patchingとしてよく知られています。

+1

注:*注意深く使用する必要があります*または(鉱山)*ここにはない可能性があります* –

0

ここで最初に書いたのは、パラメーターを取るメソッドで、これはパラメーターを取らないメソッドとは非常に異なっています。私は

ruby namechanger("Steve")

namechangerという名前のメソッドを探し、そこに文字列引数を渡すを説明してみましょう。ストレートフォワード。いくつかの未知の文脈、おそらくそのメソッドを受け取ったオブジェクトでそれを探す別のメソッドの地方を調べます。

ruby "Steve".namechanger

String上に存在する引数をとらない方法です。通常、これらのメソッドは暗黙のselfパラメータを使用して、一部のデータを操作します。

+0

パラメータドット構文では呼び出せず、引数を取らないメソッドだけが呼び出されるCABはメソッドが引数を取らないときはドット構文で呼び出されるselfはドットの前のオブジェクトを参照するために使われる? – holaSenor

+0

あなたが参照する "ドットシンタックス"は、あるオブジェクトのメソッドを呼び出すためのメカニズムに過ぎません。これは、あるオブジェクト(クラスまたはクラスのインスタンス)でメソッドを定義する場所であればどこでも使用できます。 – jer

+0

これらの例では、元のメソッドが単一の文字列を取り、文字列自体でそのメソッドを定義すると、それをパラメータとして渡す必要がないため、パラメータを持たないメソッドを定義するだけです。もちろん、 'class String;のようなメソッドを定義することもできます。 def change_to(name); –

0

あなたが"Steve".namechangerを呼び出すことができるようにしたい場合は、あなたがnamechangerこのようなStringクラスのメソッドを作成する必要があります。

class String 
    def namechanger 
    puts "This is the name to change: #{self}" 
    end 
end 

これは一般に「モンキーパッチング」と呼ばれ、あなたがしたい場合があります関連する考慮事項や議論に入る前に、一般的なRubyのスキルを少し改善してください。

0

あなたは何ができる

class String 
    def namechanger 
    puts "This is the name to change: #{self}" 
    end 
end 

違いは、あなたの最初の例は、文字列を受け取り、その上で動作します方法(基本的に)グローバルに定義されたが、あることです。しかし、このコードでは、 "namechanger"というメソッドを定義しています。このメソッドはパラメータを取らず、Stringクラスで直接定義します。したがって、アプリケーション内のすべての文字列にこのメソッドがあります。

しかし、pstによると、Rubyを少し熟知するまでは、プログラミングのスタイルに潜んではいけないので、このようなモンスキッチングを行うことの面や欠点をより簡単に見ることができます。考慮すべき点の1つは、おそらく名前を表現しない多くの文字列があり、それらの文字列がnamechangerというメソッドを持つことはあまり意味がないということです。

あなたの目標がRubyでちょっと楽しかったら、あなたができることを見てみましょう。しかし、より長い寿命を持つプロジェクトではもっと注意してください。代わりにmonkeypatchingの

1

、あなたはなかれので、サブクラス化できます

  1. は、オブジェクト本当にだと思うかについて正確です。
  2. ゲインたとえば文字列

のすべてのメソッド:

class PersonName < String 
    def namechanger 
    puts "This is the name to change: #{self}" 
    end 
end 

s = PersonName.new("Iain") 
s.namechanger 

This is the name to change: Iain 
=> nil 
+0

"Iain"を新しく渡したことに気付きましたが、ネームチェンジャーをsに呼んだときにも、それは正しく印刷されました。 'nameチェンジャーをdefするには – holaSenor

+0

Stringをサブクラス化するので、それは文字列のように機能します(それは_enhanced_文字列です)。Stringクラスで 'self'を参照すると、保持している文字列を返します。 Iain "。 – iain

+0

実際には、それを単純化するのは悪いです。どのクラスでも、selfはそれ自身を参照しています。"これは変更する名前です:___ "のような文字列にStringオブジェクトを置くと、この場合、「self」は「Iain」を出力します。 – iain

関連する問題