programing

루비 - 배열 테스트

magicmemo 2023. 5. 31. 15:48
반응형

루비 - 배열 테스트

올바른 방법은 무엇입니까?

is_array("something") # => false         (or 1)

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

아니면 그 안에 있는 물건들의 개수를 얻기 위해?

사용할 수 있습니다.

>> s = "something"
=> "something"
>> s.kind_of?(Array)
=> false
>> s = ["something", "else"]
=> ["something", "else"]
>> s.kind_of?(Array)
=> true

배열이 필요한 것이 확실합니까?다음을 사용할 수 있습니다.respond_to?(method)따라서 당신의 코드는 배열이 아닐 수도 있는 유사한 것들(아마도 다른 숫자로 셀 수 있는 것)에 대해 작동할 것입니다.만약 당신이 실제로 필요하다면.array그리고 나서 그것을 설명하는 게시물.Array#kind\_of?방법이 가장 좋습니다.

['hello'].respond_to?('each')

테스트하는 대신Array,그냥 당신이 얻는 것을 하나의 수준으로 변환하세요.Array,그래서 당신의 코드는 하나의 사건만 처리하면 됩니다.

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

루비는 객체나 객체의 배열을 취할 수 있는 API를 조화시킬 수 있는 다양한 방법을 가지고 있는데, 왜 당신이 어떤 것이 배열인지 알고 싶어하는지 추측하여 제안합니다.

스플랫 연산자는 당신이 찾을있는 많은 마법을 포함하고 있거나, 당신은 그냥 전화할 수 있습니다.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당신에게 다른 종류의 수집가를 제공합니다. (그 문제에 대해서는, 당신은 전화할 수 있습니다..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]"

그리고, 그레그슐롬 덕분에, 가끔은 그냥 사용하는 것이 더 빠릅니다.Array(x)왜냐하면 그것이 이미 있을 때.Array새 개체를 만들 필요가 없습니다.

[1,2,3].is_a? Array참으로 평가됩니다.

마치 아이템의 개념을 가진 무언가를 추구하는 것처럼 들립니다.그러므로 나는 그것이 가능한지 보는 것을 추천합니다.Enumerable그것은 또한 의 존재를 보장합니다.#count.

예를들면,

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

에 주의하십시오.size,length그리고.count모든 작업이 어레이에서 수행됩니다.count여기서 올바른 의미는 - (예를 들어,'abc'.length그리고.'abc'.size두 가지 일 모두, 하지만'abc'.count그런 식으로 작동하지 않습니다).

주의: 문자열이 _a입니까?열거할 수 있습니다. 그래서 아마 이것은 당신이 원하는 것이 아닐 것입니다.배열과 같은 개체에 대한 개념에 따라 달라집니다.

시도:

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

편집: 다른 대답이 제 대답보다 훨씬 낫습니다.

또한 사용을 고려합니다.Array()Ruby Community Style 가이드에서 다음을 수행합니다.

배열로 처리할 변수를 처리할 때는 명시적 배열 확인 또는 [*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) }

언급URL : https://stackoverflow.com/questions/1527888/ruby-test-for-array

반응형