Ruby에는 흥미로운 연산자가 많이 있습니다.
좋아요 :
- 우주선 연산자(
<=>
) - 모듈로 할당 연산자(
%=
) - 삼중 등호(
===
) 연산자 - 보다 큼(
>
) 및 미만(<
) - 같지 않음(
!=
)
이러한 연산자 중 상당수가 실제로 Ruby 메서드라는 사실을 깨닫지 못할 수도 있습니다. .
이것은...
그들이 하는 일을 덮어쓰고 이를 사용하여 자신의 클래스에서 사용자 정의 동작을 정의할 수 있습니다.
예를 들어, ==
를 정의하여 같은 클래스의 두 객체를 비교하는 방법을 Ruby에게 알려줄 수 있습니다.
지금 :
이러한 Ruby 연산자의 작동 방식 및 사용 방법에 대한 확실한 개요를 얻을 수 있도록 몇 가지 예를 살펴보겠습니다. 귀하의 코드에서.
이것은 Ruby를 정말로 이해하고 싶다면 중요한 주제입니다.
내용
- 1 Ruby 논리 연산자
- 2개의 루비 산술 연산자
- 3 할당 연산자(==, +=, ||=)
- 4 단항 연산자란 무엇입니까?
- 5 Ruby Splat 연산자(예제 포함)
- 6 매칭 연산자(=~)
- 7 Ruby 삼항 연산자(물음표 연산자)
- 8 삽/푸시 오퍼레이터(<<)
- 9 삼중 등호 연산자(보다 같음)
- 10 Safe Navigator 연산자(&.)
- 11 연산자 우선 순위 표
- 12 요약
- 12.1 관련
Ruby 논리 연산자
먼저 논리 연산자를 살펴보겠습니다.
이 연산자를 사용하여 두 개체를 비교할 수 있습니다. &결과에 따라 결정을 내립니다.
다음은 표입니다:
연산자 | 설명 |
---|---|
< | 미만 |
> | 보다 큼 |
>= | 크거나 같음 |
<= | 작거나 같음 |
== | 같음 |
!= | 같지 않음 |
<=> | 크거나 같거나 작음 |
이러한 연산자는 모두 메서드이며 부울 값을 반환합니다. , 우주선 운영자를 제외하고. 우주선 연산자는 1(보다 큼), 0(같음) 또는 -1(보다 작음)을 반환합니다.
다음은 >
를 사용하는 방법의 예입니다. 연산자:
만약 orange.stock> 20 # ...end
이중 등호(==
) 연산자를 자신의 클래스와 함께 사용하면 처음에는 작동하지 않는다는 것을 알 수 있습니다...
예 :
class 과일 def initialize(name) @name =name endendorange1 =Fruit.new("orange")orange2 =Fruit.new("orange")orange1 ==orange2# false
그 이유는 ==
의 기본 구현이 object_id
를 사용하는 BasicObject#==입니다. 두 개체가 동일한지 확인하는 방법입니다.
다음과 같이 수정할 수 있습니다.
class Fruit attr_reader :name def initialize(name) @name =name end def ==(other) name ==other.name endend
여기서 우리는 두 과일이 같다는 것이 무엇을 의미하는지 말하고 있습니다:
이름이 같아야 합니다.
루비 산술 연산자
다음 연산자 세트는 산술 연산자입니다.
여기에 새로운 것은 없습니다...
5 + 5# 1010 * 2# 2010 ** 2# 100
하지만 ==
와 마찬가지로 연산자입니다.
이는 두 개체를 함께 추가한다는 의미를 정의할 수 있기 때문에 유용합니다. .
따라서 두 개의 Order
이 있는 경우 개체를 더하면 지불해야 할 총 금액이 나오거나 이 두 주문이 결합된 새 주문이 생성됩니다.
정확히 정의할 수 있습니다. +
를 정의하여 작동하는 방법 방법.
익숙하지 않은 또 다른 연산자는 모듈로 연산자입니다. .
퍼센트 기호(%
).
그리고 그것이 하는 일은 나머지 부서를 제공하는 것입니다. .
예 :
10% 2# 0
모듈로 연산자는 실용적인 용도가 많습니다. , 숫자가 짝수인지 홀수인지 찾기, 숫자가 다른 숫자로 나누어 떨어지는지 찾기, 숫자 제한 등
할당 연산자(==, +=, ||=)
다음은 할당 연산자이며 지금까지 본 모든 연산자와 달리 메서드가 아닙니다.
기본 할당 연산자가 있습니다.
a =1
그러나 결합된 할당 연산자도 있습니다.
a +=5# 6a *=2# 12
이것은 현재 값을 읽고 산술 연산자 중 하나를 사용한 다음 결과를 저장하는 것과 같습니다. 모듈로 연산자(%
).
그러나 다른 방식으로 작동하는 두 개의 할당 연산자가 있습니다!
||=
입니다. 및 &&=
.
동일하지 않기 때문에 다릅니다. 산술 버전으로.
a ||= 100
이것은 다음과 같습니다:
"만약 a
존재하지 않거나 false
인 경우 또는 nil
그런 다음 100
할당 그렇지 않으면 a
값을 반환합니다. "
동등한 표현에 가장 가까운 것은 다음과 같습니다.
(정의?(a) &&a) ? a :a =100
이것은 "메모이제이션"으로 알려진 프로세스인 느린 계산 또는 API 요청의 결과를 저장하려는 경우에 유용합니다.
단항 연산자란 무엇입니까?
지금까지 2개의 값으로 작동하는 연산자만 보았지만 하나의 값으로만 작동하는 연산자도 있습니다. , 우리는 이것을 "단항 연산자"라고 부릅니다.
예를 들어 :
+"abc"
이렇게 하면 고정된 문자열의 변경 가능한 복사본이 생성됩니다.
고유한 단항 연산자를 정의할 수 있습니다(+
/ -
), 하지만 몇 가지 특별한 구문이 필요합니다.
예 :
class String def +@ 고정? ? self.dup :self endendstr ="abc".freezep(+str).frozen?# false
단항 연산자의 연산자 우선 순위 때문에 여기에 괄호를 사용해야 합니다.
!!
도 있습니다. , 이것은 방법이 아닙니다:
!!123# 참!!nil# 거짓
이것은 모든 값을 부울로 변환하기 때문에 유용합니다. .
그러면 !
가 있습니다. , 동일하지만 반대 부울 값을 제공합니다.
예 :
!true# false!!true# true!false# true
Ruby Splat 연산자(예제 포함)
표시 연산자(*
) 없이는 할 수 없는 일을 하기 때문에 흥미롭습니다.
다음과 같은 배열이 있다고 가정해 보겠습니다.
속성 =[:title, :author, :category]
그리고 이 배열을 attr_reader
와 같이 가변 인수를 사용하는 메서드와 함께 사용하려고 합니다. .
그러면 다음과 같이 할 수 있습니다.
attr_reader *속성
스플랫 연산자 배열을 요소 목록으로 변환합니다. 따라서 어레이를 제거하고 그 안에 있는 모든 것으로 교체하는 것과 같습니다.
즉, 마지막 예는 다음과 같이 번역됩니다.
attr_reader :title, :author, :category
이것이 스플랫 오퍼레이터의 힘입니다 🙂
매칭 연산자(=~)
이 웃기게 생긴 Ruby 연산자는 무엇입니까(=~
) 물결표와 함께?
매칭 연산자입니다!
정규식을 사용하여 빠른 색인 검색을 수행할 수 있습니다.
다음은 예입니다.
"오렌지 3개" =~ /[0-9]/# 0
이것은 숫자를 찾고 첫 번째 일치가 발견된 문자열 내부의 색인을 반환합니다 , 그렇지 않으면 nil을 반환합니다.
또한 !~
가 있습니다. "일치하지 않음" 연산자입니다.
예 :
"abc" !~ /[0-9]/# 거짓
true
가 됩니다. 또는 false
인덱스가 없으므로 이를 염두에 두십시오.
루비 삼항 연산자(물음표 연산자)
간결하고 짧은 코드를 좋아한다면 Ruby 삼항 연산자를 좋아할 것입니다.
간결한 if/else 문을 작성하는 방법입니다.
이렇게 생겼어요 :
<전>조건 ? 참 :거짓예시 :
"".크기 ==0 ? "빈 문자열" :"비어 있지 않은 문자열"
작동 방식입니다 :
삼항 연산자의 첫 번째 부분은 조건을 정의합니다("".size == 0
).
그런 다음 물음표 기호(?
).
그 후 이 조건이 true일 때에 대한 반환 값이 있습니다. .
그런 다음 콜론(:
).
마지막 부분은 이 조건이 거짓일 때의 반환 값입니다. , 이것은 else
가 됩니다. 완전한 조건식에서.
삽/푸시 오퍼레이터(<<)
이 연산자(<<
)도 메서드이므로 작업 중인 개체에 따라 수행하는 작업이 변경됩니다.
예를 들어 배열의 경우 push
의 별칭일 뿐입니다. 방법.
동물 =[]동물 <<"고양이"
문자열을 사용하면 끝에 추가됩니다:
"" <<"고양이"
그리고 Integers
, 모든 비트를 왼쪽으로 회전시키는 "왼쪽 시프트"를 수행합니다.
2 <<1# 42 <<2# 82 <<3# 16
삼중 같음 연산자(보다 같음)
오늘의 마지막 연산자는 삼중 등호 연산자(===
).
이 또한 방법이며, 예상하지 못한 곳에서도 나타납니다.
예를 들어 case 문에서:
String이 "It's string!"을 넣을 때 "bacon"의 경우 Integer가 "It's integer"를 넣을 때 end
Ruby는 ===
여기 클래스의 방법입니다.
다음과 같이:
문자열 ==="베이컨"
이것은 현재 클래스를 다른 개체의 클래스와 비교합니다.
따라서 이 연산자의 요점은 평등을 정의하는 것입니다 사례 진술의 맥락에서.
세이프 네비게이터 연산자(&.)
객체에 대한 메소드를 호출할 수 있지만 이 객체는 nil
일 수 있습니다. , nil
에서 메소드를 호출하기 때문에 좋지 않습니다. 종종 오류가 발생합니다.
단일 솔루션 :
if user &&user.active # ...end
더 나은 방법 :
if user&.active # ...end
이 &.
active
user
의 메소드 nil
이 아닌 경우 .
매우 유용합니다!
연산자 우선 순위 표
Ruby는 곱셈 및 괄호를 사용하여 수학에서 발생하는 것과 같은 우선 순위 목록에 따라 소스 코드를 평가합니다.
작동 방식을 이해하지 못하면 모든 종류의 오류가 발생할 수 있습니다.
다음은 높은 우선순위에서 낮은 우선순위로의 표입니다. :
운영자 |
---|
!, ~, 단항 + |
** |
단항 - |
*, /, % |
+, - |
<<,>> |
& |
|, ^ |
>,>=, <, <= |
<=>, ==, ===, !=, =~, !~ |
&& |
|| |
?, : |
수정자 구조 |
=, +=, -=, *=, /=, %= |
정의? |
아님 |
또는, 그리고 |
modifier-if, modifier-unless, modifier-while, modifier-until |
{ } 블록 |
do ... 블록 종료 |
modifier-something을 사용하면 이러한 키워드의 한 줄짜리 버전을 의미합니다.
예 :
blog_name =="rubyguides"인 경우 "굉장한" 표시
다음은 블록 우선 순위가 당신을 놀라게 할 수 있는 예입니다:
# 대문자로 된 배열을 반환합니다.p ["a", "b", "c"].map { |character| character.upcase }# 반환값 열거자 objectp ["a", "b", "c"].map do |character| character.upcaseend
첫 번째 경우에는 예상대로 작동하고 두 번째 경우에는 블록의 우선순위가 낮으므로 map
블록이 없다고 생각하고 열거자를 반환합니다.
요약
산술 연산자에서 논리 및 더 모호한 단항 연산자에 이르기까지 Ruby의 많은 연산자에 대해 배웠습니다.
이러한 연산자 중 대부분은 실제로 자신의 클래스에서 구현할 수 있는 메서드입니다.
유용하고 흥미로웠으면 합니다!
읽어주셔서 감사합니다 🙂