ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Programming Ruby (15) 표현식 - 2
    Ruby 2016. 10. 31. 23:38
    [출처] Programming Ruby 
    (본 게시물은 저작권의 문제 발생시 출판사의 요청에 의해 삭제될 수 있습니다.)


    대입 


    대입문은 좌변값(lvalue)에 위치한 변수나 속성이 우변값(rvalue)을 참조하게 한다. 그리고 그 값을 대입식의 결과값으로 반환한다. 이 말은 대입문도 연결해서 쓸 수 있다는 의미다.


    a = b = 1 + 2 + 3

    a      #=> 6

    b      #=> 6

    a = (b = 1 + 2) + 3

    a     #=>  6

    b     #=>  3


    File.open(name = gets.chomp)


    루비에서 대입은 두 가지 형식으로 이뤄진다. 첫째는 변수나 상수에 객체 참조(object reference)를 대입하는 것이다. 이러한 형식은 언어 자체에 내장되어 있다.


    instrument = "piano"

    MIDDLE_A = 440




    쓰기 가능한 객체 속성을 정의하는 법을 알고 있다. 단지 메서드 이름이 등호로 끝나게 정의해 주기만 하면 된다. 이 메서드는 매개 변수를 대입문의 우변값으로 받는다.


    class ProjectList

         def initialize

               @projects = [ ]

         end   

         def projects =(list)

              @projects = list.map(&:upcase)     # 이름 목록을 대문자로 저장한다.

         end

         def [ ](offset)

              @projects[offset]

         end

    end



    list = ProjectList.new

    list.projects = %w{ strip sand prime sand paint sand paint rub paint }

    list[3]     # => "SAND"

    list[4]     # => "PAINT"


    속성 설정 메서드는 내부 인스턴스 변수에 대응하지 않으면 안 된다거나, 모든 속성 쓰기 메서드는 반드시 읽기 메서드에 대응해야 한다거나 하는 제약은 존재하지 않는다. 항상 매개 변수가 대입값이 되며 반환값을 버려진다. 다음 예제에서 속성 설정 메서드는 99를 반환하지만, 실제로 설정되는 값은 2이다.



    class Test

         def val=(val)

              @val = val

              return 99

    end


    t = Test.new

    result = (t.val = )

    result # => 2




    병렬 대입


    int a = 1;     # C 또는 자바 또는 ...

    int b = 2;

    int temp;

    temp = a;

    a = b;

    b = temp;


    루비에서는 같은 일을 훨씬 깔끔하게 수행하는 코드를 다음과 같이 작성할 수 있다.


    a, b = 1, 2      # a = 1, b = 2

    a, b = b, a     # b = 2, a = 1



    루비에서는 우변값에 쉼표로 구분되는 목록을 지정할 수 있다. 대입이 이루어질 때 두 개 이상의 우변값이 있는 경우 다중 대입의 룰이 적용된다. 

    모든 우변값이 왼쪽에서 오른쪽으로 평가되며 배열에 저장된다.( 우변값이 배열이 아닌 경우) 이 배열이 대입문에 의해 반환되는 최종 값이 된다.  다음으로 좌변값을 분석한다. 좌변에 요소가 하나밖에 없다면 우변의 배열은 이 요소에 배열로서 대입된다.


    a = 1, 2, 3, 4      # a=[1, 2, 3, 4]

    b = [1, 2, 3, 4]    # b=[1, 2, 3, 4]




    전개와 대입


    루비는 우변항에서 별표(*)가 붙은 값을 발견하면, 우변값을 평가할 때 별표가 붙은 값을 전개한 다음 좌변항에 차례로 대입한다.


    a, b, c, d, e = *(1..2), 3, *[4 5]      # a=1, b=2, c=3, d=4, e=5



    좌변항에서는 단 하나의 요소에면 별표(*)가 붙을 수 있다. 


    a, *b= 1, 2, 3     # a=1, b=[2, 3]

    a, *b = 1            # a=1, b= [ ]



    별표가 붙은 요소가 좌변의 맨 뒤에 있지 않다면, 루비는 별표가 붙은 요소 뒤에 오는 모든 좌변값에 우변갑승ㄹ 대입되도록 한다.


    *a, b = 1, 2, 3, 4               # a=[1, 2, 3], b=4

    c, *d, e = 1, 2, 3, 4           # c=1, d=[2, 3], e=4

    f, *g, h, i, j = 1, 2, 3, 4      # f=1, g=[ ], h=2, i=3, j=4




    중첩 대입 


    대입문의 좌변에 괄호로 둘러싸인 목록을 둘 수 있다. 루비는 이 목록을 중첩 대이문으로 인식한다.


    a, (b, c), d = 1, 2, 3, 4          # a=1, b=2, c=nil, d=3

    a, (b, c), d = [1, 2, 3, 4]        # a=1, b=2, c=nil, d=3

    a, (b, c), d = 1, [2, 3], 4        # a=1, b=2, c=3, d=4

    a, (b, c), d = 1, [2, 3, 4], 5    # a=1, b=2, c=3, d=5

    a, (b, *c), d = 1, [2, 3, 4], 5   # a=1, b=2, c=[3, 4], d=5




    다른 형태의 대입문 


    다른 언어들처럼 루비에도 축약표현이 있다. a = a +2 는  a += 2 로 줄여 쓸 수 있다. 후자는 내부적으로 전자로 변환된다. 


    루비에서 볼 수 없는 것 중 하나는 C 와 자바의 자동 증가(++)와 자동감소(--) 연산자다. 이것들 대신에 +=이나 -=를 사용하자. 



    끄읕




    'Ruby ' 카테고리의 다른 글

    Programming Ruby (17) 표현식 - 4  (0) 2016.11.02
    Programming Ruby (16) 표현식 - 3  (0) 2016.11.02
    Programming Ruby (14) 표현식 - 1  (0) 2016.10.31
    What is Ruby Proc??  (0) 2016.10.29
    Programming Ruby (13) 메서드 파헤치기  (0) 2016.10.28
Designed by Tistory.