【问题标题】:What is a clean way of defining an array of strings in Ruby?在 Ruby 中定义字符串数组的简洁方法是什么?
【发布时间】:2011-08-29 19:42:29
【问题描述】:

假设出于某种原因,我将在 ruby​​ 脚本文件中定义一个数组变量,该文件将所有美国州作为字符串保存。这样做的干净方法是什么?通过干净,我并不是真的在寻找性能,而是更多的可读性。

以下是我尝试过但不太喜欢的几种方法:

单个 LONG 行定义。我不关心这个,因为它很长,或者需要换行。

states = ["Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado", ...]

另一个选项是多行定义,将字符串推送到数组。这解决了长线(宽度方向),但我不关心 assignment 和 array.push 的混合使用。

states = ["Alabama", "Alaska", "Arizona"]
states.push("Arkansas", "California", "Colorado")
states.push("...")

另一种选择是单行推送。这似乎是一致的,但可能需要很长时间才能完成。

states = []
states.push("Alabama")
states.push("Alaska")
states.push("Arizona")
states.push("...")

现在,当然,理想情况下,我不会对数组值进行硬编码,而是应该从数据库或 Web 服务等中提取它们。但是,出于问题的目的,让我们假设这些值不存在目前在其他任何地方。

【问题讨论】:

  • 只是为了记录,已经有提供这些数据的 gem。比较完整的一个是Carmen
  • 很高兴知道。实际上,我并不是真的在寻找状态列表。我只是用它作为例子。我很确定没有任何 gem 提供溶解气体分析单元使用的气体列表。

标签: ruby arrays string


【解决方案1】:

在 ruby​​ 中有一个用于定义此类数组的实际语法元素:

> states = %w(Alabama Alaska Arizona
>    Arkansas California
>    Colorado)
=> ["Alabama", "Alaska", "Arizona", "Arkansas", "California", "Colorado"]

但请注意,它会在空白处拆分元素。所以像“North Dakota”这样的条目最终会变成两个项目:“North”和“Dakota”。

【讨论】:

  • 您可以使用反斜杠转义空格。
  • 不错。有没有办法做 %w(File.read('states.txt'))?这种特定的语法并没有达到我的预期。
  • 你可以做File.read('states.txt').split。再次注意它在空格上拆分。反斜杠转义在这里不再起作用,因为它不再是 ruby​​ 语法,而是您正在阅读的简单字符串。
  • @Holger。是的,在空白处。但是,如果我的文件是逗号分隔的,我可以做 File.read('states.txt').split(',') 一切都会好的。当我最初发布这个问题时,我什至没有考虑外部文件。所以,如果文件以任何特殊方式格式化,我不能在原点说。
  • 此外,可以使用除() 之外的其他分隔符。我更喜欢使用%w[foo bar],我发现它更像数组
【解决方案2】:

如果你愿意,只需将它们放在多行...

states = ["Alabama",
          "Alaska",
          "Arizona",
          "Arkansas",
          "California",
          "Colorado",
          ...]

关键是用逗号结束行。以下将不起作用:

# Does not work!
states = ["Alabama"
          ,"Alaska"
          ,"Arizona"
          ,"Arkansas"
          ,"California"
          ,"Colorado"
          ...]

【讨论】:

  • 看起来绝对干净。
  • 我将把这个标记为已接受的答案。我认为这是最简洁的方法,假设状态将在脚本本身而不是外部文件中定义。外部文件可能是我要走的路,但最初的问题是“在 ruby​​ 脚本文件中”。
  • Holger 的版本是最干净的。时期。 :D
【解决方案3】:

您可以通过字符串构建数据:

states = %{Alabama
  Alaska
  Arizona
  Arkansas
  California
  Colorado
  Nort Carolina
}.each_line.map{|s| s.strip}

p states

优势: 您可以将数据存储在文本文件中。

states = states = File.readlines('countries.txt').map{|s| s.strip}

和国家.txt:

Alabama
Alaska
Arizona
Arkansas
California
Colorado
Nort Carolina

【讨论】:

    【解决方案4】:

    使用这个技巧,你会发现它可以相当巧妙地解决问题。

    ruby-1.9.2-p290 :001 > text =  %w( hello yo wazzap
    ruby-1.9.2-p290 :002]> hi
    ruby-1.9.2-p290 :003]> hello)
     => ["hello", "yo", "wazzap", "hi", "hello"] 
    ruby-1.9.2-p290 :004 > text
     => ["hello", "yo", "wazzap", "hi", "hello"] 
    

    我可能还建议将数据存储在文件中的各个行上,然后可以使用简单的命令将其生成为数组:

    array = File.readlines('input.txt')
    

    【讨论】:

    • 工作,只要你的字符串不包含空格。 (例如:北卡罗来纳州)
    • 感谢存储在文件中的想法。
    • @Ryan 真的是 @knut,我只是提到它是为了指出您可以将文件读取为 Array 的方式。
    • 但请注意,File.readlines 包含换行符。这就是为什么my solution 包含map{|s| s.strip}
    【解决方案5】:

    假设状态(数组值)不需要在脚本文件本身中定义,基于提供的所有其他答案,我可能会将状态存储在单独的逗号分隔文件中并执行此操作

    states = File.read('states.txt').split(',')
    

    【讨论】:

      猜你喜欢
      • 2023-03-21
      • 2013-07-06
      • 2021-05-01
      • 2015-04-11
      • 2011-01-10
      • 2010-10-05
      • 2010-12-08
      • 2017-05-25
      • 1970-01-01
      相关资源
      最近更新 更多