代码之家  ›  专栏  ›  技术社区  ›  BuddyJoe

Ruby-数组测试

  •  239
  • BuddyJoe  · 技术社区  · 15 年前

    正确的方法是:

    is_array("something") # => false         (or 1)
    
    is_array(["something", "else"]) # => true  (or > 1)
    

    还是要计算其中的项目数?

    7 回复  |  直到 8 年前
        1
  •  474
  •   potashin    10 年前

    你可能想用 kind_of?() .

    >> s = "something"
    => "something"
    >> s.kind_of?(Array)
    => false
    >> s = ["something", "else"]
    => ["something", "else"]
    >> s.kind_of?(Array)
    => true
    
        2
  •  140
  •   potashin    10 年前

    你确定吗? 需要 成为一个数组?你可能会使用 respond_to?(method) 因此,您的代码可以用于不一定是数组的类似事物(可能是其他一些可枚举的事情)。如果你真的需要 array ,然后是描述 Array#kind\_of? 方法是最好的。

    ['hello'].respond_to?('each')
    
        3
  •  53
  •   Community CDub    8 年前

    而不是测试 Array, 把你得到的转化成一个等级 数组, 所以您的代码只需要处理一个案例。

    t = [*something]     # or...
    t = Array(something) # or...
    def f *x
        ...
    end
    

    Ruby有各种方法来协调可以获取对象或对象数组的API,因此,猜测一下为什么要知道 一个数组,我有一个建议。

    这个 劈啪声 接线员有很多魔力 you can look up, 或者你可以打电话 Array(something) 如果需要,它将添加一个数组包装器。它类似于 [*something] 在这个例子中。

    def f x
      p Array(x).inspect
      p [*x].inspect
    end
    f 1         # => "[1]"
    f [1]       # => "[1]"
    f [1,2]     # => "[1, 2]"
    

    或者,您可以使用 劈啪声 在参数声明中,然后 .flatten 给你一个不同类型的收藏家。(关于那件事,你可以打电话给 压扁 也在上面。)

    def f *x
      p x.flatten.inspect
    end         # => nil
    f 1         # => "[1]"
    f 1,2       # => "[1, 2]"
    f [1]       # => "[1]"
    f [1,2]     # => "[1, 2]"
    f [1,2],3,4 # => "[1, 2, 3, 4]"
    

    而且,谢谢 gregschlom ,有时使用起来更快 Array(x) 因为当它已经是 Array 它不需要创建新对象。

        4
  •  16
  •   Martin Tournoij ravi.zombie    9 年前

    [1,2,3].is_a? Array 计算结果为true。

        5
  •  12
  •   Peter    15 年前

    听起来你是在找一些有项目概念的东西。所以我建议你看看是不是 Enumerable . 这也保证了 #count .

    例如,

    [1,2,3].is_a? Enumerable
    [1,2,3].count
    

    注意,当 size , length count 所有的工作都是针对阵列的, 计数 这里的意思是正确的(例如, 'abc'.length 'abc'.size 两者都工作,但 'abc'.count 不是那样的。

    注意:字符串是?可数,所以也许这不是你想要的…取决于数组类对象的概念。

        6
  •  8
  •   Lucas Jones    15 年前

    尝试:

    def is_array(a)
        a.class == Array
    end
    

    编辑 :另一个答案比我的好得多。

        7
  •  5
  •   GuyPaddock    8 年前

    同时考虑使用 Array() . 从 Ruby Community Style Guide :

    处理时使用array()而不是显式的array check或[*var]。 用一个变量作为数组,但不确定 这是一个数组。

    # bad
    paths = [paths] unless paths.is_a? Array
    paths.each { |path| do_something(path) }
    
    # bad (always creates a new Array instance)
    [*paths].each { |path| do_something(path) }
    
    # good (and a bit more readable)
    Array(paths).each { |path| do_something(path) }