Почему я не могу объединить две строки и присвоить их символу? - PullRequest
11 голосов
/ 20 марта 2009

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

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

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

:helloworld = "hello world"

Ой, подожди, это тоже не работает. (царапает голову).

Ответы [ 8 ]

18 голосов
/ 20 марта 2009

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

14 голосов
/ 12 ноября 2009

Попробуйте это:

:"hello world"
7 голосов
/ 20 марта 2009

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

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

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

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

2 голосов
/ 20 июня 2012

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

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

(:my.to_s + :way.to_s).to_sym # return :myway
2 голосов
/ 20 марта 2009

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

>> HELLO_WORLD = "hello ".concat("world")
=> "hello world"
>> HELLO_WORLD = "foo"
(irb):3: warning: already initialized constant HELLO_WORLD
=> "foo"
0 голосов
/ 30 мая 2016

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

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

output =>: "Привет, мир"

0 голосов
/ 23 февраля 2013
class Symbol
  def + (to)
    return "#{self}#{to}".to_sym
  end
end
0 голосов
/ 20 марта 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...