为什么我不能连接两个字符串并将它们分配给符号?

时间:2009-03-20 18:41:29

标签: ruby string concatenation symbols

。 。 。如在这个例子中:

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

我想如果我使用concat我正在修改字符串“hello”并向其添加“world”,然后最终将结果字符串 - “hello world” - 分配给equals左侧的:helloworld符号标志。我认为那是合法的,就像我写的那样:

:helloworld = "hello world"
哦,等等,这也行不通。 (划伤头)。

9 个答案:

答案 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我在两个参数sym1sym2中传递了两个参数:hello和:world,然后sym1和sym2转换为字符串,将它们连接起来,最后结果将字符串转换为symbol并返回。