2014-01-16 5 views
0

하나의 명령문으로이 함수를 만들 수있는 방법이 있습니까? Ruby에서 두 문을 하나의 문으로 결합하여

def test 
    err = _invalid_permission 
    return err if err # this statement 
    # do something else 
end 

내가 시도 :

def test 
    return (err = _invalid_permission) if err 
    # do something else 
end 

하지만이 iferr 항상 nil

또는이 하나, 다른 :

def test 
    return err if (err = _invalid_permission) 
    # do something else 
end 

그러나 이것은 undefined local variable or method 'err'됩니다.

def test 
    err = _invalid_permission 
    return err if err 
    err = _check_another_error 
    return err if err 
    err = _and_another_one 
    return err if err 
    # and lots more 
    # do something else when not error 
    return nil 
end 

_invalid_permission, _check_another_error_and_another_one 오류 메시지가 포함 된 비어 있지 않은 문자열이나 배열이나 해시를 반환 : 내가 일을하려고 무엇을위한

설명 방법의 이러한 종류를 단축하는 것입니다.

또 다른 이야기는, 아래의 답변을보고 난 후에, 나는 그것이 결합 수 있다고 생각 :

def test 
    err = _invalid_permission || 
    _check_another_error || 
    _and_another_one 
    # and lots more 
    return err if err 
    # do something else when not error 
    return nil 
end 
+2

원본이 꽤 좋다고 생각하고 조기 최적화에 대해 너무 걱정하고 있습니다. 다른 것들은 가독성 문제 일 것이고, 조건부 테스트에서 값을 할당하면 나는 소리를 지르 곤합니다. –

+0

암시 적 암시 적보다 낫습니다. – squiguy

+0

이 코드는 의미가 없습니다. 너 뭐하려고? – Chuck

답변

2
def test 
    (err = _invalid_permission) && return err 

    #do something else 
end 
+0

이게 아름답습니다 ^^ 고마워요, 사용 해요 :'err = _invalid_permission and return err' – Kokizzu

+2

@Kokizzu "아름다움은 소프트웨어가 너무 복잡하기 때문에 기술 분야의 어느 곳보다 더 중요합니다. 아름다움은 복잡성에 대한 궁극적 인 방어입니다." - David Gelernter – robertodecurnex

1

이 작동하지만, 당신이 '이 아무튼

def test 
    (err = _invalid_permission) ? (return err) : nil 
    #do something 
end 
+1

일종의 이상한 생각 : P – robertodecurnex

+0

코드 골프는 항상 이상합니다. –

1
def test 
    (err = _invalid_permission) or begin 
    # do something else 
    end 
end 
+0

여러분은 allllll을 나머지 문장을 하나의 문장으로 추가해야합니다. – robertodecurnex

1

선명도 희생 결합 성명서로 이동하지만, 당신이하려고하는 경우 오류 상황을 잔뜩 확인하는 것입니다, 당신은 더 이상 readably 재치를 수행 할 수 있습니다 이런 경우는 다음과 같습니다.

def test 
    err ||= _invalid_permission 
    err ||= _check_another_error 
    err ||= _and_another_one 
    return err if err 
    #do a bunch of other stuff 
end 

또는 많은 장소에서이 작업을 수행하면 예외적 인 것처럼 들릴 수 있습니다. 뭔가 같은 :

class MyValidationError < Exception 
    attr_accessor :err 
    def initialize(err) 
    @err = err 
    end 
end 

def check(err_or_nil) 
    raise MyValidationError.new(err) if err_or_nil 
end 

def test 
    check _invalid_permission 
    check _check_another_error 
    check _and_another_one 
    #do a bunch of other stuff 
rescue MyValidationError 
    $!.err 
end 

하지만 첫 번째는 매우 개인적으로 읽을 수 있다고 생각합니다.

2

올바른 질문을 하시겠습니까? 작성해야하는 코드 줄을 줄이는 한 가지 방법에 중점을 두었습니다. 대신 코드를 건조해야합니다. 여기에 한 가지 방법이다 : 당신이

def _check_another_error() "oops!" end 

def _check_another_error() nil end 

후 변경하는 경우

module Checks 
    def _invalid_permission() nil end 
    def _check_another_error() "oops!" end 
    def _and_another_one() nil end 
end 

class Doit 
    @@checks = Checks.instance_methods(false) 
    include Checks 

    def doit 
    @@checks.each { |m| rv = send(m); return rv if rv } 

    "test" 
    end 
end 

p Doit.new.doit # => "oops!" 

p Doit.new.doit # => "test" 

또한 추가, 제거 또는 검사의 이름을 변경 할 수 있습니다 이러한 접근 방식 방법을 ch를 기억할 필요없이 다른 곳에서는 그것에 대한 참조가 없습니다.

관련 문제