【问题标题】:How, in Ruby 1.8.6, to differentiate between regular symbols and "quoted" symbols?在 Ruby 1.8.6 中,如何区分常规符号和“引用”符号?
【发布时间】:2019-10-31 03:13:01
【问题描述】:

例如,:"foo":foo

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

例如

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

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

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

【问题讨论】:

  • 那为什么不总是使用字符串呢?
  • :foo:"foo" 是相同的。如果您想区分需要转义的字符,这是一回事,但您将无法区分 :foo:"foo"
  • 好吧,if sym.inspect[1] == '"' 显然可以,但你一开始就不应该这样做。
  • @SergioTulentsev 为什么这是误报?
  • 这个问题对我来说是“AB 问题!”。 ruby 中没有“引用符号”这样的东西。它纯粹是在终端中清楚地显示值的一种方式;类似于\n 代替不可见空白的显示方式。 为什么您要检查符号是否包含空格?你真正想解决什么问题?

标签: ruby symbols legacy


【解决方案1】:

Like khelwood said in the comments 带或不带引号的符号是相同的。

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

Ruby 显示一些带引号的符号和其他不带引号的符号的原因是它们的内容。符合standards of methods names的符号不带引号显示,不符合格式的符号带引号显示。

意思是:

# 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_\0" #=> :"null_byte_\x00"

Method姓名

Method 名称可能是运算符之一,或者必须以设置了八位的字母或字符开头。它可能包含字母、数字、_(下划线或下划线)或设置为八位的字符。惯例是使用下划线来分隔多词方法名中的词:

def method_name
  puts "use underscores to separate words"
end

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

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

def hello
  "hello"
end

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

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

Method 名称可以以!(爆炸或感叹号)、?(问号)或=(等号)结尾。

【讨论】:

  • 有道理,谢谢。是否有一种内置的方法来测试字符串是否可以作为方法名称?因为如果是这样,那么我可以使用它。显然我可以编写一个正则表达式来做到这一点,但如果可能的话,我宁愿使用内置的东西。
  • 这个问题问的是同一个东西(变量名,不是方法名,但我觉得规则是一样的),测试基本上是尝试用它作为变量名,如果爆炸,然后你抓住它并确定它无效。感觉有点不干净。
  • 如果你不想让你的代码保持干净,不要混合和匹配类型。符号和字符串有不同的工作要完成。我建议看看:When to use symbols instead of strings in Ruby?。如果您仍然出于某种原因想要检查符号的表示是否会被引用,请查看Stefan's comment
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-05
  • 1970-01-01
  • 2012-03-06
  • 1970-01-01
  • 1970-01-01
  • 2016-11-14
相关资源
最近更新 更多