Ruby - тест для массива

Можно сделать то же в RSpec как:

require File.dirname(__FILE__) + '/../spec_helper'

describe FoosHelper do

  it "should do something" do
    helper.some_helper_method.should == @something
  end

end
259
задан BuddyJoe 6 October 2009 в 09:21
поделиться

5 ответов

Возможно, вы захотите использовать kind_of? () .

>> s = "something"
=> "something"
>> s.kind_of?(Array)
=> false
>> s = ["something", "else"]
=> ["something", "else"]
>> s.kind_of?(Array)
=> true
503
ответ дан 23 November 2019 в 02:37
поделиться

Вы уверены, что требует, чтобы был массивом? Вы можете использовать response_to? (Method) , чтобы ваш код работал с похожими вещами, которые не обязательно являются массивами (может быть, что-то другое перечислимое). Если вам действительно нужен массив , то лучше всего подойдет сообщение с описанием метода Array # kind \ _of? .

['hello'].respond_to?('each')
146
ответ дан 23 November 2019 в 02:37
поделиться

Вместо тестирования массива, просто конвертируйте все, что вы получаете, в одноуровневый ] Array, , так что ваш код должен обрабатывать только один случай.

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

Ruby имеет различные способы согласования API, который может принимать объект или массив объектов, поэтому, угадывая, почему вы хотите знать Если что-то является массивом, у меня есть предложение.

Оператор splat содержит много магии , вы можете посмотреть вверх, или просто позвонить Массив (что-то) , который при необходимости добавит оболочку массива. Это' s похожи на [* something] в этом одном случае.

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

Или вы можете использовать splat в объявлении параметра, а затем .flatten , получив вы другой коллекционер. (В этом случае вы также можете вызвать .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) ] потому что, когда это уже массив , ему не нужно создавать новый объект.

57
ответ дан 23 November 2019 в 02:37
поделиться

Похоже, вы ищете что-то, что имеет некоторую концепцию предметов. Поэтому я бы рекомендовал посмотреть, является ли он Enumerable . Это также гарантирует существование #count .

Например,

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

обратите внимание, что, в то время как size , length и count ] все работают для массивов, count здесь правильное значение - (например, 'abc'.length и ' abc'.size оба работают, но 'abc'.count так не работает).

Внимание: строка is_a? Enumerable, так что, возможно, это не то, что вам нужно ... зависит от вашего представления о массиве, таком как объект.

15
ответ дан 23 November 2019 в 02:37
поделиться

Попробуйте:

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

ИЗМЕНИТЬ : Другой ответ намного лучше моего.

10
ответ дан 23 November 2019 в 02:37
поделиться
Другие вопросы по тегам:

Похожие вопросы: