2017-02-17 5 views
0

私はなぜ方法の名前が自動的にRubyのシンボルになるのだろうと思っています。以下のコードを実行すると:メソッドの名前はどのようにRubyのシンボルになりますか?

# create a BankAccount class 
class BankAccount 
    def initialize(name) 
    @name = name 
    @transactions = [] 
    end 

    def get_name 
    @name 
    end 
end 

aaron = BankAccount.new("Aaron") 
aaron.methods 

これは自動的に ":get_name"シンボルを作成します。これは何を意味しますか?これはどうやって起こるのですか? console.log(FN)を介して

let fn = function(){ 
    return "This is a function" 
} 

console.log(fn) 

、私は "FN" を取得することができます:私は何を意味


はJavaScriptで、私はでメソッドの名前を定義することができるということです。 しかし、Rubyでは、そのfnが:fn? 「fn」と「:fn」の違いは何ですか?

ご迷惑をおかけしますか?


私はドキュメントをチェックします。

Method#nameでメソッドを定義するときに、関数の名前がシンボルになりますか?

+0

他の方法でメソッド名を表すべきですか?文字列? – sawa

+0

申し訳ありませんが、私のコードを貼り付けると、タイプミスです – PJCHENder

答えて

0

メソッド名が「自動的に」何かになるわけではありません。 methodsメソッドは、単にどのメソッドが定義されているかを返し、シンボルとして記述します。あなたは、具体的方法にいくつかの研究をしたい場合は

、次の操作を行います。

aaron.method(:get_name) 
# => #<Method: BankAccount#get_name> 

注意これは正確に同等であること:あなたがそれを与える場合

aaron.method("get_name") 

method方法は気にしません。文字列または記号の場合は、必要に応じて変換します。

aaron.method(:get_name).source_location 

Methodクラスがサポートしている何か他のものも同様に有効です。

次に、あなたのようなものとすることを調べることができます。

2

大きな質問です。

あなたの所見は正しいです。

メソッド名は内部的にシンボルとして格納されます。各Rubyクラスには、シンボルをバイトコードの命令シーケンスにマッピングする内部ハッシュがあります。 Javascriptは文字列と記号を区別しないか、プログラマーにこの区別を与えないのに対し、後者は文字列とシンボルを区別しません。

シンボルは、スモールトークやスキームのような初期の言語に戻る概念です。それらは、同じ名前のすべてのシンボルが常に同じオブジェクトであるという追加の契約を持つ文字列の内部表現です。これにより、メソッド呼び出しやクラス名の検索など、内部プロセスを最適化することができます。

Rubyシンボルはタグ付き整数として内部的に表現され、これらのマジックナンバーを識別子名にマップする内部テーブルがあります。

+0

メソッド名がメソッド名の内部にシンボルとして保存されていますか? – PJCHENder

+0

各オブジェクトは、シンボルをバイトコードの命令シーケンスにマッピングする内部ハッシュをハッシュします。あなたがアクセスできる 'Method'オブジェクトは、ミラーを介して見ているかのように、それを外部表現したものです。いわゆる"リフレクション "です。 – akuhn

関連する問題