什么是在Ruby中定义字符串数组的简洁方法?

时间:2011-08-29 19:42:30

标签: ruby arrays string

让我们说无论出于何种原因,我将在ruby脚本文件中定义一个数组变量,该文件将所有美国状态保存为字符串。这样做的干净方法是什么?通过干净,我不是在寻找性能,而是更具可读性。

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

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

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

另一个选项是多行定义,将字符串推送到数组。这解决了长行(宽度方向),但我不关心赋值和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服务等中提取它们。但是,出于问题的目的,让我们假设值不存在当前其他任何地方。

5 个答案:

答案 0 :(得分:8)

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

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

但请注意,它会将元素拆分为空格。因此,像“北达科他”这样的条目将最终成为两个项目:“北方”和“达科他”。

答案 1 :(得分:3)

如果你愿意,可以把它们放在多行......

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

关键是用逗号结束这些行。以下内容不起作用:

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

答案 2 :(得分: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}

和countries.txt:

Alabama
Alaska
Arizona
Arkansas
California
Colorado
Nort Carolina

答案 3 :(得分:2)

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

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')

答案 4 :(得分:0)

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

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