U E D R , A S I H C RSS

Ruby Language/Expression


1. 연산자

1.1. 연산자 우선순위

  • 우선순위가 높은 것이 위
  • 아래에 있는 연산자는 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 블록 표현식
  • '++' '--" 연산자는 존재하지 않음

1.2. 연산자 재정의

  • 숫자 '+' 연산자를 곱셈 기능을 하는 것으로 바꿔버리기

class Fixnum
  def +(other)
    return self * other
  end
end
  • + 연산자는 내부적으로도 자주 쓰이기 때문에, 바꿔버리는 경우 인터프리터가 맛이 갈 수 있음

2. 대입문

  • 한꺼번에 변수 여러개 대입하기

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)


3. 조건문

3.1. 조건 연산자

  • and (=> &&), or (=> ||), not (!)
    • 기호로 쓰인 것(&&, ||, !)이 단어로 쓰인 것(and, or, not)보다 우선순위가 높음
  • defined? 연산자: 매개변수가 정의된 경우 그에 대한 설명을 문자열로 반환하고, 정의되지 않은 경우 nil을 반환

defined? 1
 -> "expression"
defined? dummy
 -> nil
defined? printf
 -> "method"
defined? $_
 -> "global variable"
defined? a = 1
 -> "assignment"

3.2. 비교 연산자

  • ==: 두 값이 같은지 비교
  • ===: case 항목의 when이 비교할 대상과 동일한지 비교
  • <=>: 왼쪽 < 오른쪽: -1, 왼쪽 = 오른쪽: 0, 왼쪽 > 오른쪽: 1
  • <, <=, >=, >: 일반적인 비교 연산자
  • =~: 정규표현식 패턴이 매칭되는지 검사
  • eql?: 서로 같은 값을 가지고 타입도 같아야 true
  • equal?: 같은 object ID를 가지고 있으면 true

3.3. 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

3.4. 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 문은 필요 없음

4. 반복문

4.1. while

  • while은 표현식으로 nil을 반환

a = b = 0
while a <= 10
  b += a
end
# b -> 55
  • while도 수식자로 쓸 수 있음: 수식된 식을 주어진 조건이 참인 동안 반복

a = 0
print a += 1 while a < 10

4.2. until

  • while과 달리 조건식이 거짓일 때만 반복

a = 0
print a += 1 until a == 10

4.3. for

  • 배열이나 범위의 요소를 하나씩 실행 (다른 언어의 foreach)
  • 요소로 쓰인 배열이나 범위를 반환

for i in 1..10 do
  print i
end
  • 위 코드는 내부적으로 아래 코드로 변환함

(1..10).each do |i|
  print i
end

4.4. 반복자

4.4.1. loop

  • 무한루프. 탈출식이 반드시 필요

loop do
  puts "hello"
end

4.4.2. times

  • Integer class의 method. Integer가 나타내는 횟수만큼 반복

5.times {puts "hello"}
  • times는 0부터 시작하는 내부 카운터를 두고 있음

5.times {|i| puts i}

4.4.3. upto, downto

  • 특정 위치에서 시작해서 1씩 증가/감소 하여 정해진 숫자까지(정해진 숫자 포함)

5.downto(1) do |i| puts i end

4.5. 탈출 구문

  • 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
Valid XHTML 1.0! Valid CSS! powered by MoniWiki
last modified 2021-02-07 05:27:56
Processing time 0.0601 sec