。 。 。如在这个例子中:
helloworld.rb:1: syntax error, unexpected '=', expecting $end
:helloworld = "hello ".concat("world")
我想如果我使用concat我正在修改字符串“hello”并向其添加“world”,然后最终将结果字符串 - “hello world” - 分配给equals左侧的:helloworld符号标志。我认为那是合法的,就像我写的那样:
:helloworld = "hello world"
哦,等等,这也行不通。 (划伤头)。
答案 0 :(得分:18)
Ruby符号不能赋值给它们,因为它们代表规范值。如果要从字符串构建符号,可以使用“hello”.concat(“world”)。to_sym。
答案 1 :(得分:14)
试试这个:
:"hello world"
答案 2 :(得分:7)
符号在来自没有类似内容的语言时会引起混淆。你不能分配符号,这不是他们的目的。
以下是一些可能有助于解释它的例子。
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
另一个很大的区别是符号比较只是一个指针比较。
答案 3 :(得分:2)
也许你真正想要的是一个常数?它们可以动态生成,稍后再提及,如果您尝试重新分配,则会收到警告。
>> HELLO_WORLD = "hello ".concat("world")
=> "hello world"
>> HELLO_WORLD = "foo"
(irb):3: warning: already initialized constant HELLO_WORLD
=> "foo"
答案 4 :(得分:2)
你不能指定一个符号但你可以返回一个符号,这个符号是其他符号的串联,虽然你必须通过字符串据我所知(我想知道是否有更好的方法)。
假设您想从符号:myway
和:my
开始获取符号:way
;
(:my.to_s + :way.to_s).to_sym # return :myway
答案 5 :(得分:0)
foo = { :helloworld => "hello ".concat("world") }
答案 6 :(得分:0)
class Symbol
def + (to)
return "#{self}#{to}".to_sym
end
end
答案 7 :(得分:0)
这对我有用
@foo = 'world'
"hello #{@foo}".to_s.to_sym
输出=> :“你好世界”
答案 8 :(得分:0)
您可以使用默认的红宝石字符串将符号转换为函数。 遵循示例
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
中传递了两个参数:hello和:world,然后sym1和sym2转换为字符串,将它们连接起来,最后结果将字符串转换为symbol并返回。