ruby符号(语法)包含什么?

Gro*_*oan 3 ruby symbols

我想创建正则表达式来匹配ruby符号,但我需要知道符号的确切语法是什么.

到目前为止,我知道以下内容:

:'string'
:"string"
:__underline
:method
:exclamation!
:question?
:@instance
:$global
Run Code Online (Sandbox Code Playgroud)

Jör*_*tag 5

你所谈论的并不完全清楚.

如果你在谈论Symbol可以包含什么,答案是:任何东西,包括换行符,任意空格,控制字符,任意奇怪和晦涩的Unicode字符,以及其他一切.

如果你在谈论写Symbol文字的各种方法,这是我最好的理解:

  • :字面:任何有效的Ruby标识符(例如:foo,:Foo,:@foo,:@@foo,:$foo,:$:,...)
  • 单引号:文字:在单引号String文字中有效的所有内容,包括转义序列,如:'\'':'\\'
  • 双引号的:文字:一切是有效的双引号String的文字,包括转义序列,如:"\"",:"\\":"\n",以及串插,它允许你注入的任意Ruby代码的结果进入Symbol,如:"#{if rand < 0.5 then RUBY_VERSION else ENV['HOME'] end}"
  • 单引号ArraySymbol小号文字:一切都在一个单引号是有效ArrayString小号文字,如%i|foo bar baz|(相当于[:foo, :bar, :baz]), %i(foo\ bar baz)(相当于[:'foo bar', :baz])%i:foo bar:(相当于[:foo, :bar])
  • 双引号ArraySymbol小号文字:一切都在双引号是有效ArrayString小号文字,如%I|foo #{bar} baz|,等
  • Symbolkey: value语法中的散列键:每个有效的Ruby标签,例如{foo: 42}
  • Symbol引用'key': value语法中的散列键:每个有效的Ruby String文字,包括转义序列和插值,例如{"foo\n#{bar}": 42}

当然还有很多其他表达式可以评估为Symbol:

  • 方法定义表达式: def foo;end # => :foo
  • String#to_sym(别名String#intern):'foo bar'.to_sym # => :'foo bar'
  • 真的,任何可能return的方法Symbol