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

もう 1 つの大きな違いは、シンボル比較が単なるポインター比較であることです。

于 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 = 'world'
"hello #{@foo}".to_s.to_sym

出力 => :"こんにちは世界"

于 2016-05-30T11:20:08.983 に答える
0
class Symbol
  def + (to)
    return "#{self}#{to}".to_sym
  end
end
于 2013-02-23T01:08:22.340 に答える