Ответ 1
Попробуйте следующее:
:"hello world"
., как в этом примере:
helloworld.rb:1: syntax error, unexpected '=', expecting $end
:helloworld = "hello ".concat("world")
Я думал, что если я использую concat, я изменяю строку "hello" и добавляю к ней "мир", а затем в конечном итоге назначаю полученную строку - "hello world" - символу helloworld слева от равных знак. Я думал, что это будет законно, как если бы я написал:
:helloworld = "hello world"
О, подождите, это тоже не сработает. (царапины).
Попробуйте следующее:
:"hello world"
Символы Ruby не могут иметь назначенные им значения, так как они представляют собой каноническое значение. Если вы хотите построить символ из строки, вы можете использовать "привет".concat( "мир" ). To_sym.
сбивают с толку при переходе с языков, которые не имеют ничего подобного. Вы не можете назначать символы, это не то, для чего они предназначены.
Вот несколько примеров, которые могут помочь объяснить.
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
Другое большое различие заключается в том, что сравнение символов - это просто сравнение указателей.
Возможно, то, что вы действительно ищете, является константой? Они могут быть динамически сгенерированы, о чем упоминается позже, и вы получите предупреждение, если попытаетесь переназначить его.
>> HELLO_WORLD = "hello ".concat("world")
=> "hello world"
>> HELLO_WORLD = "foo"
(irb):3: warning: already initialized constant HELLO_WORLD
=> "foo"
Вы не можете назначить символ, но вы можете вернуть символ, который является конкатенацией других символов, хотя вам нужно пройти через строки, насколько я знаю (я хотел бы знать, есть ли лучший способ).
Предположим, вы хотите получить символ :myway
, начиная с символов :my
и :way
;
(:my.to_s + :way.to_s).to_sym # return :myway
Хорошо, да. Вы не можете назначать символы. Вы имеете в виду что-то вроде:
foo = { :helloworld => "hello ".concat("world") }
?
class Symbol
def + (to)
return "#{self}#{to}".to_sym
end
end
Это сработало для меня
@foo = 'world'
"hello #{@foo}".to_s.to_sym
output = > : "hello world"
Вы можете создать функцию, используя стандартную рубиновую строку для преобразования символов. Следуйте примеру
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 преобразуются в строку и объединяют их и, наконец, приводят преобразование строки в символ и вернуться.