무엇인지 확인하기 @some_var
위해
if @some_var.class.to_s == 'Hash'
나는 여부를 확인하는 더 우아한 방법이 확신 @some_var
A는 Hash
나가 Array
.
[result_hash, another_result_hash]
또는 single_result_hash
? 그 API를 만든 사람은 잘하지 못했습니다!
무엇인지 확인하기 @some_var
위해
if @some_var.class.to_s == 'Hash'
나는 여부를 확인하는 더 우아한 방법이 확신 @some_var
A는 Hash
나가 Array
.
[result_hash, another_result_hash]
또는 single_result_hash
? 그 API를 만든 사람은 잘하지 못했습니다!
답변:
당신은 할 수 있습니다 :
@some_var.class == Hash
또는 다음과 같은 것 :
@some_var.is_a?(Hash)
"is_a?"라는 점은 주목할 가치가 있습니다. 클래스가 객체 조상 트리의 아무 곳에 나 있으면 메소드는 true입니다. 예를 들어 :
@some_var.is_a?(Object) # => true
@some_var가 Object에서 파생 된 해시 또는 다른 클래스의 인스턴스 인 경우 위의 내용이 적용됩니다. 따라서 == 또는 instance_of?를 사용하여 클래스 유형을 엄격히 일치 시키려면? 방법은 아마도 당신이 찾고있는 것입니다.
is_a?
true
서브 클래스 도 리턴하므로 최상의 옵션 입니다.
@som_var.is_a? Hash
작동합니다 :)
ActiveSupport::HashWithIndifferentAccess
는 Hash에서 상속 받으므로이 @some_var.is_a?(Hash)
경우에도 true를 반환합니다. (방금 같은 질문과 HashWithIndifferentAccess 사례가 있었고 귀하의 의견에서 약간 혼란 스러웠습니다. 그래서 명확히하고 싶습니다)
루비에서는 보통 "type"을 찾을 때 실제로 "duck-type"또는 "ducks as duck?"을 원합니다. 특정 방법에 응답하는지 확인할 수 있습니다.
@some_var.respond_to?(:each)
@some_var는 다음에 응답하기 때문에 반복 할 수 있습니다.
실제로 유형을 알고 싶다면 Hash 또는 Array 인 경우 다음을 수행 할 수 있습니다.
["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
sort
먼저 주문하십시오.
["Hash", "Array"].include?(@some_var.class.to_s) #=> check both through instance class
실제로는 단순한 변수가 아니라 변수가 배열인지 해시인지에 따라 다르게 행동하기를 원할 것입니다. 이 상황에서 우아한 관용구는 다음과 같습니다.
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"]
을 올릴 것이다TypeError
.