- RubyLanguage
- RubyLanguage/Class
- RubyLanguage/Container
- RubyLanguage/ExceptionHandling
- RubyLanguage/InputOutput
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.1. 조건 연산자 ¶
- and (=> &&), or (=> ||), not (!)
- 기호로 쓰인 것(&&, ||, !)이 단어로 쓰인 것(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.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.3. for ¶
- 배열이나 범위의 요소를 하나씩 실행 (다른 언어의 foreach)
- 요소로 쓰인 배열이나 범위를 반환
for i in 1..10 do print i end
- 위 코드는 내부적으로 아래 코드로 변환함
(1..10).each do |i| print i end