Question

. . . comme dans cet exemple:

helloworld.rb:1: syntax error, unexpected '=', expecting $end
:helloworld = "hello ".concat("world")

Je pensais que si j'utilise concat je suis modifier la chaîne « bonjour » et en ajoutant « monde », pour ensuite attribuer finalement la chaîne résultante - « Bonjour tout le monde » - au: symbole helloworld sur le côté gauche des égaux signe. Je pensais que ce serait légal, comme si je l'avais écrit:

:helloworld = "hello world"

oh, attendez, cela ne fonctionne pas non plus. (Rayures tête).

Était-ce utile?

La solution

Essayez ceci:

:"hello world"

Autres conseils

symboles Ruby ne peuvent pas avoir des valeurs qui leur sont assignées, car ils représentent une valeur canonique. Si vous voulez construire un symbole d'une chaîne, vous pouvez utiliser « bonjour » .concat ( « monde »). To_sym.

symboles sont source de confusion en venant de langues qui ne sont pas quelque chose comme eux. Vous ne pouvez pas attribuer à des symboles, ce n'est pas ce qu'ils sont pour.

Voici quelques exemples qui peuvent aider à expliquer.

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

L'autre grande différence est qu'une comparaison symbole est simplement une comparaison de pointeur.

Peut-être ce que vous cherchez réellement pour est une constante? Ils peuvent être générés dynamiquement, appelés plus tard, et vous obtenez un avertissement si vous essayez de les réaffecter.

>> HELLO_WORLD = "hello ".concat("world")
=> "hello world"
>> HELLO_WORLD = "foo"
(irb):3: warning: already initialized constant HELLO_WORLD
=> "foo"

Vous ne pouvez pas attribuer à un symbole, mais vous pouvez retourner un symbole qui est une concaténation d'autres symboles, bien que vous devez passer par les chaînes pour autant que je sais (je voudrais savoir s'il y a une meilleure façon).

Supposons que vous voulez obtenir le symbole des :myway à partir des symboles et :my :way;

(:my.to_s + :way.to_s).to_sym # return :myway

Eh bien, oui. Vous ne pouvez pas attribuer aux symboles. Voulez-vous dire quelque chose comme:

foo = { :helloworld => "hello ".concat("world") }

class Symbol
  def + (to)
    return "#{self}#{to}".to_sym
  end
end

Cela a fonctionné pour moi

@foo = 'world'
"hello #{@foo}".to_s.to_sym

output =>: "Bonjour tout le monde"

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top