Warum kann ich verketten nicht zwei Strings und ordnen sie ein Symbol?
-
21-08-2019 - |
Frage
. . . wie in diesem Beispiel:
helloworld.rb:1: syntax error, unexpected '=', expecting $end
:helloworld = "hello ".concat("world")
Ich dachte, wenn ich Concat verwende ich bin Modifizieren der Zeichenfolge „Hallo“ und fügte hinzu: „Welt“, um es dann letztlich die resultierende Zeichenfolge zuweisen - „Hallo Welt“ - zum: Hello World Symbol auf der linken Seite des Gleichheits Schild. Ich dachte, das wäre legal, so als ob ich geschrieben hatte:
:helloworld = "hello world"
Oh, warten Sie, das funktioniert auch nicht. (Kratzer Kopf).
Lösung
Versuchen Sie folgendes:
:"hello world"
Andere Tipps
Ruby-Symbole können nicht Werte, die ihnen zugewiesen haben, da sie einen kanonischen Wert darstellen. Wenn Sie ein Symbol aus einem String bauen möchten, können Sie „Hallo“ .concat ( „Welt“) verwenden. To_sym.
Symbole verwirren, wenn sie von Sprachen kommen, die nichts wie sie haben. Sie können nicht auf Symbole zuweisen, das ist nicht, was sie für.
Hier sind ein paar Beispiele, die es helfen kann zu erklären.
5.times do |i|
# a new string is created in each iteration of the loop
puts "my string".object_id
# there is only ever one symbol for each possible value
# so a new object is not created during each iteration
puts :my_symbol.object_id
# this often makes a difference when you're using them for things like hash keys
#some_method(:name => 'bob')
#some_method('name' => 'bob')
end
Der andere große Unterschied ist, dass ein Symbol Vergleich ist einfach ein Zeiger Vergleich.
Vielleicht, was Sie suchen tatsächlich für eine Konstante? Sie können dynamisch erzeugt werden, bezeichnet später, und Sie erhalten eine Warnung, wenn Sie versuchen, eine neu zuzuweisen.
>> HELLO_WORLD = "hello ".concat("world")
=> "hello world"
>> HELLO_WORLD = "foo"
(irb):3: warning: already initialized constant HELLO_WORLD
=> "foo"
Sie können nicht auf ein Symbol zuweisen, aber Sie können ein Symbol zurück, die eine Verkettung von anderen Symbolen ist, obwohl Sie so weit durch Strings passieren müssen, wie ich weiß (Ich mag gerne wissen, ob es einen besseren Weg gibt).
Angenommen, Sie auf das Symbol :myway
aus den Symbolen beginnen :my
und :way
erhalten wollen;
(:my.to_s + :way.to_s).to_sym # return :myway
Nun, ja. Sie können nicht auf Symbole zuweisen. Meinst du so etwas wie:
foo = { :helloworld => "hello ".concat("world") }
class Symbol
def + (to)
return "#{self}#{to}".to_sym
end
end
Das ist für mich gearbeitet
@foo = 'world'
"hello #{@foo}".to_s.to_sym
output =>: "Hallo Welt"