[[pagelist(^RubyLanguage)]] [[TableOfContents]] = 연산자 = == 연산자 우선순위 == * 우선순위가 높은 것이 위 * 아래에 있는 연산자는 method 로 정의되어 있으며 재정의가 가능하다. || 연산자 || 설명 || || [] []= || 요소 참조, 요소 설정 || || ** || 누승 (2**3 = 8) || || ! ~ + - || 단항연산자 (역논리, bit NOT, unary plus, unary minus) || || * / & || 곱셈, 나눗셈, 나머지 || || >> << || shift || || & || bit AND || || ^ | || bit XOR, bit OR || || <= < > >= || 비교 연산자 || || <=> == === != || 동등 비교 || * method 로 정의되지 않은 연산자 || =~ !~ || 패턴 매칭 || || && || 논리곱 || || || || 논리합 || || .. ... || 범위 || || ? : || 삼항 연산자 || || = %= ~= /= -= += |= &= >>= <<= *= &&= ||= **= || 대입 연산자 || || defined || 심벌이 정의되었는지 검사 || || Not || 역논리 || || or and || 논리 구성 || || if unless while until || 표현식 제한자 || || begin end || 블록 표현식 || * '++' '--" 연산자는 존재하지 않음 == 연산자 재정의 == * 숫자 '+' 연산자를 곱셈 기능을 하는 것으로 바꿔버리기 {{{ class Fixnum def +(other) return self * other end end }}} * + 연산자는 내부적으로도 자주 쓰이기 때문에, 바꿔버리는 경우 인터프리터가 맛이 갈 수 있음 = 대입문 = * 한꺼번에 변수 여러개 대입하기 {{{ a, b = 1, 2 # a -> 1, b -> 2 }}} * swap 구현 {{{ a, b = b, a }}} * 좌변값과 우변값 개수가 다른 경우 * 좌변값이 하나라면, 그 값은 우변값이 모두 들어간 배열이 된다. * 좌변값이 둘 이상이라면, 우변값과 대응되지 못한 좌변값은 nil(없는 값)이 된다. * 좌변값의 맨 마지막 변수 앞에 *을 붙이면 남은 우변값이 배열로 들어간다. {{{ a, b = 1, 2, 3 # a -> 1, b -> 2 a, b, c = 1, 2 # a -> 1, b -> 2, c -> nil a = 1, 2, 3 # a -> [1, 2, 3] (array) a, *b = 1, 2, 3 # a -> 1, b -> [2, 3] (array) }}} = 조건문 = == 조건 연산자 == * and (=> &&), or (=> ||), not (!) * 기호로 쓰인 것(&&, ||, !)이 단어로 쓰인 것(and, or, not)보다 우선순위가 높음 * defined? 연산자: 매개변수가 정의된 경우 그에 대한 설명을 문자열로 반환하고, 정의되지 않은 경우 nil을 반환 {{{ defined? 1 -> "expression" defined? dummy -> nil defined? printf -> "method" defined? $_ -> "global variable" defined? a = 1 -> "assignment" }}} == 비교 연산자 == * ==: 두 값이 같은지 비교 * ===: case 항목의 when이 비교할 대상과 동일한지 비교 * <=>: 왼쪽 < 오른쪽: -1, 왼쪽 = 오른쪽: 0, 왼쪽 > 오른쪽: 1 * <, <=, >=, >: 일반적인 비교 연산자 * =~: [정규표현식] 패턴이 매칭되는지 검사 * eql?: 서로 같은 값을 가지고 타입도 같아야 true * equal?: 같은 object ID를 가지고 있으면 true == if == * if는 구문이 아니라 표현식 (실행된 부분의 마지막 식의 값을 반환값으로 가짐) {{{ if song.artist == "Gillespie" then handle = "Dizzy" elsif song.artist == "Parker" then handle = "Bird else handle = "unknown" end }}} * 실행되는 문장의 줄이 분리되어 있으면 then 생략 가능 * then은 콜론(:)으로 대체 가능 * unless: if의 부정형. if not으로 대체 가능 * 수식자로 사용: 조건이 참일 때만 식을 수행 {{{ print if a == 10 }}} == case == * case는 구문이 아니라 표현식 (실행된 부분의 마지막 식의 값을 반환값으로 가짐) {{{ kind = case year when 1850..1889 then "Blues" when 1890..1909 then "Ragtime" when 1910..1929 then "New Orleans Jazz" when 1930..1939 then "Swing" when 1940..1950 then "Bebop" else "Jazz" end }}} {{{ leap = case when year % 400 == 0 then true when year % 100 == 0 then false else year % 4 == 0 end }}} * 별도의 break 문은 필요 없음 = 반복문 = == while == * while은 표현식으로 nil을 반환 {{{ a = b = 0 while a <= 10 b += a end # b -> 55 }}} * while도 수식자로 쓸 수 있음: 수식된 식을 주어진 조건이 참인 동안 반복 {{{ a = 0 print a += 1 while a < 10 }}} == until == * while과 달리 조건식이 거짓일 때만 반복 {{{ a = 0 print a += 1 until a == 10 }}} == for == * 배열이나 범위의 요소를 하나씩 실행 (다른 언어의 foreach) * 요소로 쓰인 배열이나 범위를 반환 {{{ for i in 1..10 do print i end }}} * 위 코드는 내부적으로 아래 코드로 변환함 {{{ (1..10).each do |i| print i end }}} == 반복자 == === loop === * 무한루프. 탈출식이 반드시 필요 {{{ loop do puts "hello" end }}} === times === * Integer class의 method. Integer가 나타내는 횟수만큼 반복 {{{ 5.times {puts "hello"} }}} * times는 0부터 시작하는 내부 카운터를 두고 있음 {{{ 5.times {|i| puts i} }}} === upto, downto === * 특정 위치에서 시작해서 1씩 증가/감소 하여 정해진 숫자까지(정해진 숫자 포함) {{{ 5.downto(1) do |i| puts i end }}} == 탈출 구문 == * break: 반복 구조를 빠져나감 * next: 현재의 남은 반복 구조를 패스하고 다음 반복을 수행함 * redo: 현재의 남은 반복 구조를 다시 수행함 (조건을 검사하지 않음) * retry: 맨 처음부터 반복을 다시 시작함 * 탈출 구문은 if 수식자를 사용하는 것이 간편함 {{{ even = 0 multiple10 = 0 100.times do |i| next if i%2 != 0 even += 1 next if i%10 != 0 multiple10 += 1 end # even -> 50, multiple10 -> 10 }}}