Почему я не могу конкатенировать две строки и назначить их символу?

., как в этом примере:

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

Я думал, что если я использую concat, я изменяю строку "hello" и добавляю к ней "мир", а затем в конечном итоге назначаю полученную строку - "hello world" - символу helloworld слева от равных знак. Я думал, что это будет законно, как если бы я написал:

:helloworld = "hello world"

О, подождите, это тоже не сработает. (царапины).

Ответ 1

Попробуйте следующее:

:"hello world"

Ответ 2

Символы Ruby не могут иметь назначенные им значения, так как они представляют собой каноническое значение. Если вы хотите построить символ из строки, вы можете использовать "привет".concat( "мир" ). To_sym.

Ответ 3

Символы

сбивают с толку при переходе с языков, которые не имеют ничего подобного. Вы не можете назначать символы, это не то, для чего они предназначены.

Вот несколько примеров, которые могут помочь объяснить.

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

Другое большое различие заключается в том, что сравнение символов - это просто сравнение указателей.

Ответ 4

Возможно, то, что вы действительно ищете, является константой? Они могут быть динамически сгенерированы, о чем упоминается позже, и вы получите предупреждение, если попытаетесь переназначить его.

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

Ответ 5

Вы не можете назначить символ, но вы можете вернуть символ, который является конкатенацией других символов, хотя вам нужно пройти через строки, насколько я знаю (я хотел бы знать, есть ли лучший способ).

Предположим, вы хотите получить символ :myway, начиная с символов :my и :way;

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

Ответ 6

Хорошо, да. Вы не можете назначать символы. Вы имеете в виду что-то вроде:

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

?

Ответ 7

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

Ответ 8

Это сработало для меня

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

output = > : "hello world"

Ответ 9

Вы можете создать функцию, используя стандартную рубиновую строку для преобразования символов. Следуйте примеру

def sum_of_two_sym(sym1, sym2)
    (sym1.to_s + sym2.to_s).to_sym
end

sum_of_two_sym(:hello, :world)

Результат покажет: helloworld

Здесь я просто пишу функцию, имя функции sum_of_two_sym, я передаю два параметра: привет и: мир с двумя аргументами sym1 и sym2, затем sym1 и sym2 преобразуются в строку и объединяют их и, наконец, приводят преобразование строки в символ и вернуться.