programing

왜 Ruby는 i++ 또는 i--(증분/감분 연산자)를 지원하지 않습니까?

telecom 2023. 6. 9. 21:46
반응형

왜 Ruby는 i++ 또는 i--(증분/감분 연산자)를 지원하지 않습니까?

증분/ 연산자사사/감후증연/소산자분전▁(감(연자사++그리고.--)는 상당히 표준적인 프로그래밍 언어 구문입니다(적어도 절차 및 객체 지향 언어의 경우).

왜 루비는 그들을 지원하지 않습니까?저는 당신이 같은 일을 할 수 있다는 것을 압니다.+=그리고.-=하지만 그런 것을 배제하는 것은 이상하게 자의적으로 보입니다. 특히 간결하고 관습적이기 때문입니다.

예:

i = 0    #=> 0
i += 1   #=> 1
i        #=> 1
i++      #=> expect 2, but as far as I can tell, 
         #=> irb ignores the second + and waits for a second number to add to i

는 이해합니다.Fixnum 불이지만면 약에만변.+=단지 새로운 것을 예시할 수 있습니다.Fixnum그리고 그것을 설정합니다, 왜 같은 것을 하지 않습니까.++?

다을포할일관성의당이 =캐릭터가 이것의 유일한 이유인가요, 아니면 제가 뭔가를 놓치고 있나요?

마츠(마츠모토 유키히로)가 오래된 스레드로 설명하는 방법은 다음과 같습니다.

Hi,

In message "[ruby-talk:02706] X++?"
    on 00/05/10, Aleksi Niemelä <aleksi.niemela@cinnober.com> writes:

|I got an idea from http://www.pragprog.com:8080/rubyfaq/rubyfaq-5.html#ss5.3
|and thought to try. I didn't manage to make "auto(in|de)crement" working so
|could somebody help here? Does this contain some errors or is the idea
|wrong?

  (1) ++ and -- are NOT reserved operator in Ruby.

  (2) C's increment/decrement operators are in fact hidden assignment.
      They affect variables, not objects.  You cannot accomplish
      assignment via method.  Ruby uses +=/-= operator instead.

  (3) self cannot be a target of assignment.  In addition, altering
      the value of integer 1 might cause severe confusion throughout
      the program.

                            matz.

까지 모든 연산자 변수를 가 한가이 즉모연할가산자당(든, 변변는연산자하경지를까)를 있기 입니다.= 안에. 그안에더. 하면면하▁in더.++그리고.--더 이상 그렇지 않습니다.

는 또다이의행의 입니다.++그리고.--종종 사람들을 혼란스럽게 합니다.해사당례 : 의반값의 i++당신의 예에서 실제로는 2가 아닌 1이 될 것입니다(의 새로운 값).i하지만 2일 것입니다.

OO 언어에서는 일반적이지 않습니다. 실사, 없다니는 .++"객체 지향 프로그래밍"이라는 용어를 만든 언어인 Smalltalk에서 루비가 가장 강하게 영향을 받은 언어입니다.당신이 의미하는 것은 C 언어에서 관습적이고 C를 가깝게 모방한다는 것입니다.루비는 다소 C와 같은 구문을 가지고 있지만, C 전통을 고수하는 데 있어서는 슬레이브적이지 않습니다.

그것이 루비에 없는 이유에 대해서: Matz는 그것을 원하지 않았습니다.그것이 바로 궁극적인 이유입니다.

스몰토크에 그런 것이 존재하지 않는 이유는 변수를 할당하는 것은 근본적으로 객체에 메시지를 보내는 것과 다른 종류의 것이라는 언어의 최우선 철학의 일부이기 때문입니다. 다른 수준에 있습니다.이러한 생각은 아마도 Matz가 Ruby를 디자인하는 데 영향을 미쳤을 것입니다.

하지 않을 것입니다. 은 모든 Ruby를 할 수 . 모든 것을 변환하는 전처리기를 쉽게 작성할 수 있습니다.++안으로+=1하지만 분명히 Matz는 "숨은 임무"를 수행하는 운영자의 아이디어를 좋아하지 않았습니다.또한 내부에 숨겨진 정수 피연산자가 있는 연산자가 있는 것도 약간 이상해 보입니다.언어의 다른 연산자는 그런 식으로 작동하지 않습니다.

것 요: 또다른이있것을같다습니가유다것같▁i니.++Ruby에서는 C와 그 직접적인 후계자들처럼 원격으로 유용하지 않을 것입니다.

그이는유,,,for키워드: C에서는 필수적이지만 루비에서는 대부분 불필요합니다.의 작업은 Ruby 와 같은 방법을 됩니다.each그리고.map구조를 할 때, 어떤데구통반해때복할조를, 고그리터이.Fixnum#times정확한 횟수만큼 반복해야 하는 경우의 방법입니다.

사실, 제가 본 바로는, 대부분의 시간은+=1C 스타일 언어에서 Ruby로 새로 이주한 사람들이 사용합니다.

간단히 말해서, 방법이 정말로 의심스럽습니다.++그리고.--사용될 수도 있습니다.

다음을 정의할 수 있습니다..+자체 계산 연산자:

class Variable
  def initialize value = nil
    @value = value
  end
  attr_accessor :value
  def method_missing *args, &blk
    @value.send(*args, &blk)
  end
  def to_s
    @value.to_s
  end

  # pre-increment ".+" when x not present
  def +(x = nil)
    x ? @value + x : @value += 1
  end
  def -(x = nil)
    x ? @value - x : @value -= 1
  end
end

i = Variable.new 5
puts i                #=> 5

# normal use of +
puts i + 4            #=> 9
puts i                #=> 5

# incrementing
puts i.+              #=> 6
puts i                #=> 6

"클래스 변수"에 대한 자세한 내용은 "Fixnum 개체를 증분하는 클래스 변수"에서 확인할 수 있습니다.

Matz가 그들을 좋아하지 않는 이유는 실제로 변수를 새로운 변수로 대체하기 때문이라고 생각합니다.

ex:

a = Some Class.new패배를 인정함안녕하세요끝.이 시점에서, 당신은 a.go에 전화할 수 있습니다.하지만 만약 당신이 a++를 했다면.그것은 정말로 a = a + 1을 의미합니다.그래서 당신은 더 이상 a.go에 전화할 수 없습니다.본래의 것을 잃어버렸으므로.

만약 누군가가 그에게 #succ!라고 부르거나 그렇지 않다고 설득할 수 있다면, 그것은 더 말이 되고 문제를 피할 수 있을 것입니다.당신은 그것을 루비 코어에 제안할 수 있습니다.

그리고 그의 책 "우량한 루비스트"의 데이비드 블랙의 말에 따르면:

Ruby의 일부 개체는 변수에 즉시 값으로 저장됩니다.여기에는 정수, 기호(이와 같은 모양) 및 특수 개체 true, false 및 nil이 포함됩니다.이러한 값 중 하나를 변수(x = 1)에 할당하면 변수는 참조가 아니라 값 자체를 유지합니다.실제적인 측면에서, 이것은 문제가 되지 않습니다(그리고 종종 이 책의 참고 문헌 및 관련 주제에 대한 논의에서 반복적으로 설명하기보다는 암시된 대로 남겨집니다).Ruby는 객체 참조의 역참조를 자동으로 처리합니다. 즉, 문자열에 대한 참조를 포함하는 객체에 메시지를 보내기 위해 즉시 정수 값을 포함하는 객체와 달리 추가 작업을 수행할 필요가 없습니다.그러나 즉시값 표현 규칙은 특히 정수에 관한 한 몇 가지 흥미로운 결과를 가지고 있습니다.우선, 즉각적인 값으로 표시되는 객체는 할당된 변수의 수에 관계없이 항상 동일한 객체입니다.개체 100개만 있고 개체 100개만 거짓입니다.정수 바인딩 변수의 즉각적이고 고유한 특성은 Ruby에 사전 및 사후 계산 연산자가 없는 배경에 있습니다. 즉, Ruby에서는 이 작업을 수행할 수 없습니다. x = 1 x++ # 그 이유는 x에 1이 즉시 존재하기 때문에 x++가 1++,그 말은 당신이 숫자 1을 숫자 2로 바꾼다는 것을 의미합니다. 그것은 말이 안 됩니다.

Ruby의 일부 개체는 변수에 즉시 값으로 저장됩니다.여기에는 정수, 기호(이와 같은 모양) 및 특수 개체 true, falsenil이 포함됩니다.이러한 값 중 하나를 변수(x = 1)에 할당하면 변수는 참조가 아니라 값 자체를 유지합니다.

즉시 값으로 표시되는 개체는 할당된 변수 수에 관계없이 항상 동일한 개체입니다.개체 100개만 있고 개체 100개만 거짓입니다.

정수 바인딩 변수의 즉각적이고 고유한 특성은 Ruby가 증가 전후 연산자를 사용하지 않는 배경에 있습니다. 즉, Ruby에서는 이 작업을 수행할 수 없습니다.

x=1

x++ # 해당 연산자 없음

그 이유는 x에 1이 즉시 존재하기 때문에 x++은 1++과 같으며, 이는 숫자 1을 숫자 2로 변경한다는 것을 의미합니다. 이것은 말이 안 됩니다.

fixnum 또는 Integer 클래스에 새 메서드를 추가하면 이 작업을 수행할 수 없습니까?

$ ruby -e 'numb=1;puts numb.next'

반환 2

"파괴적인" 방법은 다음과 같이 추가된 것 같습니다.!가능한 사용자에게 경고하기 위해 다음과 같은 새로운 방법을 추가합니다.next!요청한 것을 거의 수행할 것입니다.

$ ruby -e 'numb=1; numb.next!; puts numb' 

2를 반환합니다(숫자가 증가했기 때문에).

론물, 그.next!메소드는 객체가 실수가 아닌 정수 변수인지 확인해야 하지만 를 사용할 수 있어야 합니다.

언급URL : https://stackoverflow.com/questions/3660563/why-doesnt-ruby-support-i-or-i-increment-decrement-operators

반응형