변수가 해시인지 배열인지 알 수 있는 루비의 우아한 방법은 무엇입니까?
무엇을 확인하기 위해@some_var
나는 하는 중입니다.
if @some_var.class.to_s == 'Hash'
저는 더 우아한 방법으로 확인할 수 있다고요@some_var
이다.Hash
또는Array
.
다음을 수행할 수 있습니다.
@some_var.class == Hash
또는 다음과 같은 것도 있습니다.
@some_var.is_a?(Hash)
"is_a?" 방법은 클래스가 개체 조상 트리의 어느 곳에나 있는 경우에 참이라는 것에 주목할 필요가 있습니다.예를 들어:
@some_var.is_a?(Object) # => true
위는 @some_var가 객체에서 파생된 해시 또는 다른 클래스의 인스턴스인 경우에 참입니다.클래스 유형에 대해 엄격한 일치를 원한다면 == 또는 instance_of를 사용하시겠습니까?방법이 아마도 당신이 찾고 있는 것일 것입니다.
무엇보다도, 문자 그대로의 질문에 대한 가장 좋은 대답은
Hash === @some_var
하지만 그 질문은 여기서 오리 타이핑을 하는 방법을 보여줌으로써 정말로 대답되었어야 했습니다.그것은 당신이 어떤 종류의 오리를 필요로 하는지에 따라 약간 다릅니다.
@some_var.respond_to?(:each_pair)
또는
@some_var.respond_to?(:has_key?)
아니 심지어는
@some_var.respond_to?(:to_hash)
응용 프로그램에 따라 옳을 수 있습니다.
일반적으로 루비색으로 "유형"을 찾을 때 실제로 "오리형" 또는 "오리처럼 돌팔이가"를 원하는 것입니다.특정 방법에 대응하는지 확인할 수 있습니다.
@some_var.respond_to?(:each)
다음에 응답하므로 @some_var를 반복할 수 있습니다.
해시 또는 어레이 유형을 알고 싶다면 다음을 수행할 수 있습니다.
["Hash", "Array"].include?(@some_var.class) #=> check both through instance class
@some_var.kind_of?(Hash) #=> to check each at once
@some_var.is_a?(Array) #=> same as kind_of
Hash === @some_var #=> return Boolean
이것은 사례 진술에도 사용될 수 있습니다.
case @some_var
when Hash
...
when Array
...
end
사용할 수 있습니다.instance_of?
예
@some_var.instance_of?(Hash)
사용자:
@var.respond_to?(:keys)
Hash 및 ActiveSupport에서 작동합니다.다른 액세스 권한을 가진 해시입니다.
실제로 변수가 단순한 tell이 아니라 Array인지 해시인지에 따라 다르게 동작하는 경우가 많습니다.이 경우 우아한 관용구는 다음과 같습니다.
case item
when Array
#do something
when Hash
#do something else
end
호출하지 않습니다..class
에 대한 방법.item
.
개체가 엄격한지 또는 확장되었는지 테스트하려는 경우Hash
사용:
value = {}
value.is_a?(Hash) || value.is_a?(Array) #=> true
그러나 Ruby의 오리 타이핑을 활용하기 위해 다음과 같은 작업을 수행할 수 있습니다.
value = {}
value.respond_to?(:[]) #=> true
이 기능은 다음을 사용하여 일부 값에만 액세스하려는 경우에 유용합니다.value[:key]
통사론
참고로
Array.new["key"]
a를 올릴 것입니다.TypeError
.
irb(main):005:0> {}.class
=> Hash
irb(main):006:0> [].class
=> Array
언급URL : https://stackoverflow.com/questions/5367114/what-is-an-elegant-way-in-ruby-to-tell-if-a-variable-is-a-hash-or-an-array
'programing' 카테고리의 다른 글
투명 이미지 버튼을 사용하는 방법:안드로이드 (0) | 2023.07.07 |
---|---|
디렉토리 / 계층 / 트리 구조를 데이터베이스에 저장하는 방법은 무엇입니까? (0) | 2023.07.07 |
테이블의 모든 행 삭제 (0) | 2023.07.07 |
500.21 불량 모듈 목록의 "Managed Pipeline Handler" (0) | 2023.07.07 |
적용의 FUN에 몇 가지 인수 전달(및 기타 *적용) (0) | 2023.07.07 |