Pergunta

. . . como neste exemplo:

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

Eu pensei que se eu usar concat estou modificando a string "Olá" e acrescentando "mundo" a ele e, em seguida, em última análise, atribuindo a string resultante - "Olá mundo" - para o símbolo: helloworld no lado esquerdo dos iguais placa. Eu pensei que seria legal, como se eu tivesse escrito:

:helloworld = "hello world"

Oh, espere, isso não quer trabalhar. (Arranhões cabeça).

Foi útil?

Solução

Tente isto:

:"hello world"

Outras dicas

símbolos Ruby não podem ter valores atribuídos a eles uma vez que representam um valor canônico. Se você quer construir um símbolo de uma string, você pode usar "Olá" .concat ( "mundo"). To_sym.

símbolos são confusas quando provenientes de línguas que não têm nada parecido com eles. Você não pode atribuir aos símbolos, não é isso que eles são para.

Aqui estão alguns exemplos que podem ajudar a explicar isso.

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

A outra grande diferença é que uma comparação símbolo é simplesmente uma comparação ponteiro.

Talvez o que você está procurando realmente é uma constante? Eles podem ser gerados dinamicamente, referido mais tarde, e você receber um aviso se você tentar um Reassign.

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

Você não pode atribuir a um símbolo, mas você pode retornar um símbolo que é uma concatenação de outros símbolos, embora você tem que passar por cordas, tanto quanto eu sei (eu gostaria de saber se existe uma maneira melhor).

Suponha que você queira obter o símbolo :myway a partir da :my símbolos e :way;

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

Bem, sim. Você não pode atribuir aos símbolos. Você quer dizer algo como:

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

?

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

Isso funcionou para mim

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

saída =>: "Olá mundo"

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top