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()
.
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.
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.
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?
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.
Ich habe es jetzt verstanden. Ich habe ein Symbol zugewiesen, aber eine Zeichenfolge erwartet.
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.
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% .
verwendenSymbole 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.
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.