Por que não posso concatenar duas cordas e atribuir-lhes um símbolo?
-
21-08-2019 - |
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).
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"