Ruby-Symbol als Methodenaufruf verstehen [duplizieren]

8
%Vor%

Hier funktioniert das Symbol wie erwartet, aber hier:

%Vor%

warum : s hier gedruckt wird ?? Ich verstehe nicht den Grund dafür. Kann mir bitte jemand erklären?

    
sunny1304 06.02.2013, 18:45
quelle

5 Antworten

14

Symbole sind leichte Zeichenfolgen (obwohl sie keine Zeichenfolgen sind). Die Methoden send() und method() können Zeichenfolgen oder Symbole enthalten. der eine wird in den anderen in den anderen umgewandelt (nicht sicher welcher) und dann führt Ruby die Methode mit dem passenden Namen aus. Daher ist A.send(:text) gleichbedeutend mit A.text() . Wenn Sie eine Variable mit dem Namen methodName = :text hätten, könnten Sie A.send(methodName) aber nicht A.methodName() .

verwenden

Symbole sind keine Variablen, daher können Sie einem Symbol keinen Wert zuweisen. In Ihrem Beispiel ist das Symbol% ​​co_de% unabhängig von der Variablen :s (trotz der Tatsache, dass sie den gleichen "Namen" haben, vorangestellt mit einem Doppelpunkt macht es ein Symbol anstelle einer Variablen). Sie weisen der Variablen s einen Zeichenfolgenwert zu, geben aber an, das Symbol% ​​co_de% zu drucken, was sie tut.

    
iamnotmaynard 06.02.2013 19:04
quelle
3

Von Zypern :

p foo tut puts foo.inspect , dh es druckt den Wert von inspect anstelle von to_s , was besser zum Debuggen geeignet ist (weil Sie zB den Unterschied zwischen 1 , "1" und "2\b1" , was beim Drucken ohne inspect nicht möglich ist.

    
TheDude 06.02.2013 18:52
quelle
2
___ qstnhdr ___ Ruby-Symbol als Methodenaufruf verstehen [duplizieren] ___ answer 14736528 ___

Sie setzen den Wert von s1 auf: s, also warum sollten Sie erwarten, dass etwas anderes zurückgegeben wird?

Wenn Sie sich die Ruby-API für die Object-Klasse ansehen, sehen Sie beide Objekt # senden und Objekt # Methode nehmen a Symbol als Parameter, so wird auch das obere Beispiel völlig erwartet.

    
___ qstntxt ___
%Vor%

Hier funktioniert das Symbol wie erwartet, aber hier:

%Vor%

warum : s hier gedruckt wird ?? Ich verstehe nicht den Grund dafür. Kann mir bitte jemand erklären?

    
___ answer14736580 ___

Von Zypern :

%code% tut puts %code% , dh es druckt den Wert von %code% anstelle von %code% , was besser zum Debuggen geeignet ist (weil Sie zB den Unterschied zwischen %code% , %code% und %code% , was beim Drucken ohne inspect nicht möglich ist.

    
___ answer14736840 ___
%Vor%

Ich habe es jetzt verstanden. Ich habe ein Symbol zugewiesen, aber eine Zeichenfolge erwartet.

    
___ answer14736838 ___

Symbole sind nur eine spezielle Art von Zeichenfolge, die für die Laufzeit effizienter ist. Das ist es. Sie sind keine Methoden oder Variablen oder ähnliches.

Wenn du %code% machst, sagst du nur "hey, A, rufe die Methode namens 'test'" auf. Sie senden nicht die Methode selbst, nur den Namen; Es ist die Logik in %code% , die dafür verantwortlich ist, nach der eigentlichen Methode zum Aufrufen zu suchen.

Das Gleiche gilt, wenn Sie nach einer Methode mit %code% fragen. Alles, was Sie an %code% übergeben, ist der Name "test", nicht die Methode, die als "test" definiert wurde. Es ist bis zu %code% den Namen zu verwenden und find die tatsächliche Methode, so dass sie es zurückgeben kann, und es ist der Rückgabewert - ein Method-Objekt - den Sie %code% ausführen. Sie können %code% nicht auf einem Symbol wie %code% ausführen, weil es nur ein Name ist.

    
___ tag123ruby ___ Ruby ist eine multi-plattform Open-Source, dynamische objektorientierte interpretierte Sprache, erstellt von Yukihiro Matsumoto (Matz) im Jahr 1995. Die [Ruby] -Tag ist für Fragen im Zusammenhang mit der Ruby-Sprache, einschließlich seiner Syntax und seiner Bibliotheken . Fragen speziell zum Ruby-on-Rails-Framework sollten mit [ruby-on-rails], nicht [ruby] getaggt werden. Verwenden Sie dies nicht, um Ruby in der japanischen Sprache zu markieren. ___ tag123ruby19 ___ Ruby 1.9 ist eine Abkürzung für die Ruby-Versionen 1.9.1, 1.9.2 und 1.9.3. Ruby ist eine dynamische Sprache, die sich auf Einfachheit und Ausdruckskraft konzentriert. ___ answer14736750 ___

Symbole sind leichte Zeichenfolgen (obwohl sie keine Zeichenfolgen sind). Die Methoden %code% und %code% können Zeichenfolgen oder Symbole enthalten. der eine wird in den anderen in den anderen umgewandelt (nicht sicher welcher) und dann führt Ruby die Methode mit dem passenden Namen aus. Daher ist %code% gleichbedeutend mit %code% . Wenn Sie eine Variable mit dem Namen %code% hätten, könnten Sie %code% aber nicht %code% .

verwenden

Symbole sind keine Variablen, daher können Sie einem Symbol keinen Wert zuweisen. In Ihrem Beispiel ist das Symbol% ​​co_de% unabhängig von der Variablen %code% (trotz der Tatsache, dass sie den gleichen "Namen" haben, vorangestellt mit einem Doppelpunkt macht es ein Symbol anstelle einer Variablen). Sie weisen der Variablen %code% einen Zeichenfolgenwert zu, geben aber an, das Symbol% ​​co_de% zu drucken, was sie tut.

    
___
DanSingerman 06.02.2013 18:49
quelle
2
%Vor%

Ich habe es jetzt verstanden. Ich habe ein Symbol zugewiesen, aber eine Zeichenfolge erwartet.

    
sunny1304 06.02.2013 19:09
quelle
1

Symbole sind nur eine spezielle Art von Zeichenfolge, die für die Laufzeit effizienter ist. Das ist es. Sie sind keine Methoden oder Variablen oder ähnliches.

Wenn du A.send(:test) machst, sagst du nur "hey, A, rufe die Methode namens 'test'" auf. Sie senden nicht die Methode selbst, nur den Namen; Es ist die Logik in send , die dafür verantwortlich ist, nach der eigentlichen Methode zum Aufrufen zu suchen.

Das Gleiche gilt, wenn Sie nach einer Methode mit A.new.method(:test) fragen. Alles, was Sie an method übergeben, ist der Name "test", nicht die Methode, die als "test" definiert wurde. Es ist bis zu method den Namen zu verwenden und find die tatsächliche Methode, so dass sie es zurückgeben kann, und es ist der Rückgabewert - ein Method-Objekt - den Sie call ausführen. Sie können call nicht auf einem Symbol wie :test ausführen, weil es nur ein Name ist.

    
Mark Reed 06.02.2013 19:09
quelle

Tags und Links