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의 많은 연산자에 대해 배웠습니다.
이러한 연산자 중 대부분은 실제로 자신의 클래스에서 구현할 수 있는 메서드입니다.
유용하고 흥미로웠으면 합니다!
읽어주셔서 감사합니다 🙂