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).

War es hilfreich?

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"

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top