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

What can a ruby symbol (syntax) contain?

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

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

:'string'
:"string"
:__underline
:method
:exclamation!
:question?
:@instance
:$global

http://www.cse.buffalo.edu/~regan/cse305/RubyBNF.pdf 枚举定义 Ruby 语法的上下文无关文法产生式。 CFG 本质上比 RE 更强大,因此您可能想考虑使用不同的工具来完成这项工作——但您当然可以查看此文档并尝试构建匹配所有情况的正则表达式。

你说的不是很清楚。

如果你在谈论 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}"
  • 单引号 Array of Symbols 文字:在 Strings 文字的单引号 Array 中有效的所有内容,例如%i|foo bar baz|(相当于[:foo, :bar, :baz]),%i(foo\ bar baz)(相当于[:'foo bar', :baz]),%i:foo bar:(相当于[:foo, :bar]
  • double-quoted Array of Symbols literal:在双引号 Array of Strings literal 中有效的所有内容,例如%I|foo #{bar} baz|,等等
  • Symbol key: value 语法中的散列键:每个有效的 Ruby 标签,例如{foo: 42}
  • Symbol 引用的 'key': value 语法中的散列键:每个有效的 Ruby String 文字,包括转义序列和插值,例如{"foo\n#{bar}": 42}

当然还有很多其他表达式的计算结果为 Symbols:

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