Можно сделать то же в RSpec как:
require File.dirname(__FILE__) + '/../spec_helper'
describe FoosHelper do
it "should do something" do
helper.some_helper_method.should == @something
end
end
Возможно, вы захотите использовать kind_of? ()
.
>> s = "something"
=> "something"
>> s.kind_of?(Array)
=> false
>> s = ["something", "else"]
=> ["something", "else"]
>> s.kind_of?(Array)
=> true
Вы уверены, что требует, чтобы был массивом? Вы можете использовать response_to? (Method)
, чтобы ваш код работал с похожими вещами, которые не обязательно являются массивами (может быть, что-то другое перечислимое). Если вам действительно нужен массив
, то лучше всего подойдет сообщение с описанием метода Array # kind \ _of?
.
['hello'].respond_to?('each')
Вместо тестирования массива,
просто конвертируйте все, что вы получаете, в одноуровневый ] 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)
] потому что, когда это уже массив
, ему не нужно создавать новый объект.
Похоже, вы ищете что-то, что имеет некоторую концепцию предметов. Поэтому я бы рекомендовал посмотреть, является ли он 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, так что, возможно, это не то, что вам нужно ... зависит от вашего представления о массиве, таком как объект.
Попробуйте:
def is_array(a)
a.class == Array
end
ИЗМЕНИТЬ : Другой ответ намного лучше моего.