在 Ruby 1.8.6 中,如何区分常规符号和"quoted"符号?



例如,:"foo"vs:foo

更具体地说,如果我有一个像"Clarinet (B♭)"这样的字符串,并且我在其上调用.to_sym,我会得到一个带引号的符号,带有转义字符::"Clarinet (B342231255)"。 在这种情况下,我想使用它的字符串版本而不是符号版本作为哈希键。 更一般地说,如果我得到任何带引号的符号,我根本不想使用该符号,而只使用原始字符串。

例如

ahash = {}
s = "Clarinet (B♭)"
sym = s.to_sym
if some_test_for_quoted_symbols
ahash[sym] = "foo"
else
ahash[s] = "foo"
end

有谁知道我如何区分带引号或不带引号的符号? 谢谢

PS 请不要告诉我我不应该使用这么旧版本的 Ruby。 谢谢!

就像 khelwood 在评论中说的那样,带或不带引号的符号是相同的。

:foo == :"foo" #=> true

Ruby 显示一些带引号的符号和其他不带引号的符号的原因是由于它们的内容。符合方法名称标准的符号将显示为不带引号,而不符合格式的符号将显示为引号。

意思是:

# operators are displayed without quotes
:">>" #=> :>>
# snake case naming will be displayed without quotes
:"foo_bar" #=> :foo_bar
# symbols starting with a number will be displayed with quotes
:"8bit" #=> :"8bit"
# symbols with certain characters will be displayed as quoted
:"foo-bar" #=> :"foo-bar"
:"foo bar" #=> :"foo bar"
:"null_byte_" #=> :"null_byte_x00"

方法名称¶

方法名称可以是运算符之一,或者必须以字母或字符开头设置了八位。它可以包含字母,数字,_(下划线或低线)或具有八位设置的字符。约定是使用下划线分隔多字方法名称中的单词:

def method_name
puts "use underscores to separate words"
end

Ruby 程序必须以 US-ASCII 兼容字符集编写,例如 UTF-8、ISO-8859-1 等。在此类字符集中,如果设置了八位,则表示扩展字符。Ruby 允许方法名称和其他标识符包含此类字符。Ruby 程序不能包含某些字符,如 ASCII NUL(x00)。

以下是有效 Ruby 方法的示例:

def hello
"hello"
end
def こんにちは
puts "means hello in Japanese"
end

通常,方法名称与 US-ASCII 兼容,因为键入它们的键存在于所有键盘上。

方法名称可以以!(撞号或感叹号)、?(问号)或=(等号)结尾。

最新更新