2012-04-26 4 views
5

문자열과 기본 값을 취하고 문자열이 정수를 나타내는 경우이를 정수로 변환하거나 그렇지 않으면 기본값을 반환하는 루비 메서드가 있습니까?루비 문자열을 기본값으로 변환

갱신 나는 다음과 같은 대답이 바람직하다 생각 : 자신 있다는 가능성을 사용하여 코딩

> def time; t = Time.now; yield; Time.now - t end 

> time { 1000000.times { |i| ('_' << i.to_s) =~ /\d+/ } } 
=> 1.3491532 
> time { 1000000.times { |i| Integer.new('_' << i.to_s) rescue nil } } 
=> 27.190596426 
+0

"정수 포함"이란 무엇을 의미합니까? –

+0

' "조기 최적화는 모든 악의 근원" "- Donald Knuth – Reactormonk

답변

2

당신은해야합니다 :

여기
class String 
    def try_to_i(default = nil) 
    /^\d+$/ === self ? to_i : default 
    end 
end 

는 예외를 피해야하는 이유 증거 문자열을 검사하는 정규 표현식 :

def try_to_i(str, default = nil) 
    str =~ /^-?\d+$/ ? str.to_i : default 
end 
+0

음수는 어떨까요? – Reactormonk

+0

@Tass : 지적 해 주셔서 감사합니다 :) –

8

변환 할 #to_iInteger()이 있습니다. 첫 번째 문자는 기본값이 이고 두 번째 문자는 ArgumentError를 발생시킵니다.

class String 
    def to_integer(default) 
    Integer(self) 
    rescue ArgumentError 
    default 
    end 
end 
+0

정상적인 사용 사례에 대한 예외 사용은 너무 높은 성능 오버 헤드라고 생각합니다. – Alexey

+0

나는 이것이 더 우아한 해결책이라는 데 동의해야하며 받아 들여야합니다. 나는'Integer()'에 대해 몰랐기 때문에 이것을 제안하지 않았다. @Alexey : 작업에 대한 정규 표현식을 사용하는 오버 헤드가 훨씬 더 문제가됩니다. –

+0

Niklas, 질문에서 업데이트를 참조하십시오. – Alexey

-1

당신은 같은 것을 할 수있는 :

int_value = (stringVar.match(/^(\d+)$/) && $1.to_i) || default_value 

문자열이 숫자로 완전히 구성되어 있는지 확인합니다, 그렇다면 INT 또는 기본 값을 반환 변환합니다.

+0

Ruby에는'? :'이 (가) 있으며, 왜 신뢰할 수없는'&& ... || ... 관용구? –

+0

IMO, 정수 연산자를 사용하는 대신 정수 case를 괄호 블록으로 묶는 것이 더 개념적으로 바람직합니다. 또한, 어떻게 &&/|| 신뢰할 수 없는? 물론, 서면 - 단어 동등 연산자 (및/또는) 사이를 전환하면 우선 순위 문제가 있지만 일관된 사용으로이를 제거합니다. 모든 말, 그것은 당신에게 달려 있습니다. - 삼자가 당신의 스타일에 어울리는다면, 그것으로 가십시오. –

+0

'&&'와'|| '사이의 부분이'false' 또는'nil'이 될 수 있다면 항상 두 번 생각해야한다는 사실을 의미했습니다.이 경우 조건 연산자 나'if ..'와 같지 않습니다. then .. else'. 'to_i'가 항상 정수 값을 반환하기 때문에이 경우에는 괜찮습니다. BTW, 귀하의 예제에서는 괄호가 필요하지 않습니다. –