2011-08-17 2 views
9

저는 코드를 개선하기 위해 Ruby에서 파이썬의 while/else struct와 같은 것을 항상 찾고있었습니다.파이썬의 for/else에 해당하는 Ruby equivalent

즉, 루프가 실행되고 루프의 조건이 언제든지 true가 아닌 경우 else 문에 값을 반환합니다.

루비에서, I는 다음과 같이 수행 할 수 있습니다

if @items.empty? 
    "Empty" 
else 
    @items.each do |item| 
    item 
    end 
end 

그래서를 향상시킬 수있는 방법이 무엇입니까?

미리 감사드립니다.

답변

3

흠, 당신은 삼항로 작성할 수

@items.empty? ? 'Empty' : @items.each { |item| item } 

당신은 비록 당신의 블록에 더 유용한 일을 할 수 있습니다, each가 부작용에 대해 실행하고 원래 수신기를 반환하기 때문에. 귀하의 의견에 따라

업데이트 : 나는 당신이 얻을 수있는 가장 가까운

unless @items.empty? 
    @items.each { |item| p item } 
else 
'Empty' 
end 
+0

나는 단지 한 줄로 그다지 좋아하지 않습니다. 그건 분명하지 않아. 내가 원하는 것은 오히려 while/else/end와 같은 것이다. 어쩌면 불가능할 수도 있겠지만 그 질문이 가치 있다고 생각합니다. – Cydonia7

+1

파이썬의'while/else'를 찾았습니다. @Zabba가 맞습니다. 삼항 형이 맘에 들지 않는다면 가장 가까운 것이 아마도'unless..else' 일 것입니다. IMHO 모든 언어를 다른 언어로 번역하려고 시도하는 것은 의미가 없지만 YMMV. –

+0

모든 언어를 번역하려하지는 않았지만이 구조체가 파이썬에서 유용하다고 생각합니다. 답장을 보내 주셔서 감사합니다 :) – Cydonia7

24

같은 반복자 블록이 더 사용하기 위해 테스트 할 수있는, 그것으로 무엇을 넣어 반환 기억 것 같다.

if arr.each do |item| 
    item.some_action(some_arg) 
end.empty? 
    else_condition_here 
end 
+3

이것은 끔찍한 끝내줍니다. –

0

다소 기능적 방법 : 우리는 루비 때문에

empty_action = { true => proc{ "Empty"}, 
       false => proc{ |arr| arr.each { |item| item }} } 

empty_action[@items.empty?][@items] 
1

이의 재미를 보자. 루비는이 같은 사용될 수있는 강력한 case 구조, 있습니다 위의 코드를 작동하게하는 그러나

case items 
when -:empty? then "Empty" 
else items.each { |member| 
    # do something with each collection member 
    } 
end 

을, 우리는 먼저 기본 클래스 Symbol을 수정해야합니다. 원시 클래스의 수정은 Ruby 전문 분야입니다. 이 작업은 라이브러리 (보석)에서 한 번만 수행하면되므로 필요할 때마다 도움이됩니다. 이 경우, 수정은 다음과 같습니다

class Symbol 
    def [email protected] 
    Object.new 
    .define_singleton_method :=== do |o| o.send self end 
    end 
end 

이 코드가 사용되어, -:sym 말을하는 것은 :=== 방법으로 패치 된 빈 객체를 새로 원숭이를 반환, 단항 마이너스 같은 방법으로 Symbol 클래스의 (-) 연산자를 오버로드 사건의 진술 뒤에