2012-02-24 3 views
2

이것은 내가 발견 한 가장 가까운하지만 숫자 대신 부울 다루는 : 코드가 짧고 쉽게 읽을 유지하면서 나는 루비 0 시나리오에 의해 분할을 피하기 위해 노력하고있어 DRY up Ruby ternaryRuby의 3 진수가 더 짧습니까?

.

나는 다음과 같은 코드 좀 더 간결하게 만들고 싶어 :

number_to_percentage ((percent_complete.nan? ? 0 : (percent_complete * 100)), :precision => 0) 

또는

number_to_percentage ((percent_complete.nan? ? 0 : percent_complete) * 100, :precision => 0) 

그냥 지금 읽고 정말 열심히 보인다. 연결된 체인이 더 많으므로 percent_complete은 실제로 약간 길었습니다. 메소드에서이 값을 반환하기 때문에 다시 길어집니다.

나는 임시 변수를 사용하거나 메소드 이름을 줄이는 것을 피하고 싶다. 그래서 다른 방법을 배우기를 바랬다.

"percent_complete"를 두 번 입력하지 않아도된다면 해결할 수 있습니다.

+0

NaN 대신'nil'으로 끝나기 위해'percent_complete'을 변경할 수 있습니까? 그러면'nil.to_i == 0'을 이용할 수 있습니다. –

+0

@mu가 너무 짧습니다. 제안에 감사드립니다. 나는 그것을 nil로 바꿀 수 있을지 확신하지 못한다. 나는 그것을 조사해야 할 것이다. 현재 percent_complete는 부동 소수점을 실수로 나눈 값입니다. –

+0

개인적으로, 문체면에서는 메서드에 대한 매개 변수 목록 안의 삼항문을 보지 않는 것이 좋습니다. –

답변

1

내가 좋겠 : 당신이 쓸 수있는 것

class Object 
    # substitute a different object if 'predicate' is true 
    # if 'predicate' is :nil?, this is just like || 
    def guard(predicate,substitute) 
    send(predicate) ? substitute : self 
    end 
end 

desi에서 NaN을 처리하는 사용자 정의 도우미를 추가하기 만하면됩니다. 빨간 방법.

# in app/helpers/extra_number_helper.rb 
module ExtraNumberHelpers 
    def number_or_nan_to_percentage(number, options = { }) 
     number = 0 if(number.respond_to(:nan?) && number.nan?) 
     number_to_percentage(number, options) 
    end 
end 

그런 다음 특별한 NaN 처리가 필요한 경우 number_or_nan_to_percentage을 사용하십시오. 또한 코드에서 작업하는 사람들에게 가능한 값으로 NaN을 명시 적으로 처리하고 있다는 사실을 알려주는 행복한 부작용이 있습니다.

+0

이 제안에 감사드립니다. 그 행복한 부작용은 확실히 큰 플러스입니다. –

4

Numeric에서 새 메서드를 정의하지 않는 이유는 무엇입니까?

class Numeric 
    def safe_to_f 
    self.nan? ? 0.0 : self.to_f 
    end 
end 

당신이 좋아하는 경우에 당신은 또한 추가 할 수 있습니다 : 여기

class NilClass 
    def safe_to_f 
    0.0 
    end 
end 

다른 생각 :

percent_complete.guard(:nan?, 0) 
+0

제안 해 주셔서 감사합니다. 나는 더 많이 "내장 된"것이 있었으면 좋겠다. 그러나 그것은 확실히 작동 할 수있다. 다시 한 번 감사드립니다! –

+1

@ALi, Ruby에 대한 훌륭한 점 중 하나입니다. 언어를 "구부릴"수있는 방법이 많이 있으며, 내장 된 기능 만 사용할 수 있습니다. 핵심 수업을 확장하는 데 익숙해 져야합니다. 만약 당신이 잘한다면, 많은 상황에서 코드를 더 간결하고 우아하게 만들 수있는 강력한 기술입니다. –

+0

그 모든 위대한 제안에 다시 한 번 감사드립니다! 어느 쪽을 가야할지 결정하기가 어렵습니다. –