a = [4, 3, 2, nil]
a.max_by { |v| v * 2 } => NoMethodError: undefined method `*' for nil:NilClass
nil 값을 무시하도록 max_by를 오버로드하는 방법은 무엇입니까?Ruby Enumerable 클래스를 확장하여 nil을 무시하도록 max_by 클래스를 확장하는 방법은 무엇입니까?
a = [4, 3, 2, nil]
a.max_by { |v| v * 2 } => NoMethodError: undefined method `*' for nil:NilClass
nil 값을 무시하도록 max_by를 오버로드하는 방법은 무엇입니까?Ruby Enumerable 클래스를 확장하여 nil을 무시하도록 max_by 클래스를 확장하는 방법은 무엇입니까?
오신 것을 환영합니다 루비 : 문제를 해결하기 위해 많은 방법이있다!
아주 간단한 해결책은 다음과 같습니다 전무 이후
a.max_by { |v| v.to_f * 2 }
이이 음의 값을 처리하지 않습니다 0으로 떠 강제 변환,하지만 전무는 것과 같이 지금 NilClass라는 클래스의 단일 인스턴스이기 때문에 우리가 그것을 열 수 있습니다 루비에서 모든 클래스는 그것이 littly 수학 배워 봅시다 : 지금 우리가
class NilClass
# overloading * operator
def *(y)
# returning negative infinity: Ruby 1.8.7
-1.0/0.0
# returning negative infinity: Ruby 1.9.2
# -Float::INFINITY
end
end
을
a.max_by { |v| v * 2 }
4를 반환합니다.
max_by
으로 전화하기 전에 Array.compact
을 사용하여 nils를 제거 할 수 있습니다. 이 분명히 compact
보다 더 복잡 귀하의 예를 들어
a.max_by { |v| v.nil? ? -Float::INFINITY : v }
#=> 4
,하지만 당신은 배열을 정렬하고 nil
값을 유지하려는 경우 그것은 편리한 트릭 :
a.compact.max_by { |v| v * 2 }
는 여기에 또 다른 하나입니다. 아니면 끝까지 제로처럼 이상한 방식으로 정렬 할 경우 :
[0,4,5,6,1,9].sort_by { |v| v.zero? ? Float::INFINITY : v }
#=> [1, 4, 5, 6, 9, 0]
작동하지만 OP 질문 (Enumerable 클래스를 확장하는 방법)에 대해서는 답변이 없습니다. –