11

. . . 如本例所示:

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

我想如果我使用 concat 我正在修改字符串“hello”并添加“world”,然后最终将生成的字符串 - “hello world” - 分配给等号左侧的 :helloworld 符号。我认为这是合法的,就像我写的一样:

:helloworld = "hello world"

哦,等等,这也不起作用。(抓头)。

4

9 回答 9

19

Ruby 符号不能为它们分配值,因为它们代表规范值。如果要从字符串构建符号,可以使用 "hello".concat("world").to_sym。

于 2009-03-20T18:47:08.910 回答
16

试试这个:

:"hello world"
于 2009-11-12T02:00:27.873 回答
8

当来自没有类似符号的语言时,符号会令人困惑。你不能分配给符号,那不是它们的用途。

这里有几个例子可以帮助解释它。

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

另一个很大的区别是符号比较只是一个指针比较。

于 2009-03-20T19:31:44.403 回答
2

也许你真正在寻找的是一个常数?它们可以动态生成,稍后参考,如果您尝试重新分配它们,则会收到警告。

>> HELLO_WORLD = "hello ".concat("world")
=> "hello world"
>> HELLO_WORLD = "foo"
(irb):3: warning: already initialized constant HELLO_WORLD
=> "foo"
于 2009-03-20T19:39:57.193 回答
2

你不能分配给一个符号,但你可以返回一个符号,它是其他符号的串联,尽管据我所知你必须通过字符串(我想知道是否有更好的方法)。

假设您要从符号和:myway开始获取符号;:my:way

(:my.to_s + :way.to_s).to_sym # return :myway
于 2012-06-20T15:14:45.317 回答
0

嗯,是的。您不能分配给符号。你的意思是这样的:

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

?

于 2009-03-20T18:47:01.487 回答
0
class Symbol
  def + (to)
    return "#{self}#{to}".to_sym
  end
end
于 2013-02-23T01:08:22.340 回答
0

这对我有用

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

输出=>:“你好世界”

于 2016-05-30T11:20:08.983 回答
0

您可以使用默认的 ruby​​ 字符串到符号转换来创建函数。根据例子

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

于 2019-08-29T08:42:26.073 回答