Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

Ruby 연산자에 대해 알아야 할 모든 것

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의 많은 연산자에 대해 배웠습니다.

이러한 연산자 중 대부분은 실제로 자신의 클래스에서 구현할 수 있는 메서드입니다.

유용하고 흥미로웠으면 합니다!

읽어주셔서 감사합니다 🙂