왜 루비 1.9에 문장이 적용되지 않는다면?


답변:


9

루비 1.9에서이 작업을 한 두 가지 이유는 다음 슬라이드에 있지만 발표자의 대화가 없으면 분명하지 않을 수 있습니다. 범위가없는 if명령문으로 허용 되는 두 가지 작업은 if 문 외부에서 액세스 할 수있는 소스 코드의 항목을 정의하는 것입니다.

첫 번째 예 : 메소드 교체

class Employee
  if String.method_defined?(:encode)
    def name
      ...
    end
  else
    def name
      ...
    end
  end
end

이 예제 에는 메소드에 대한 두 가지 정의name있습니다. 경우에 사용됩니다 하나의 String.encode방법이 존재하고, 인코딩 방법이 존재하지 않는 경우에 사용됩니다 하나 (열등 구현). 기본적으로 라이브러리에서 지원하는 경우 올바르게 인코딩 된 문자열을 사용할 수 있습니다.

두 번째 예 : 구현 대체

if String.method_defined?(:encode)
  module Builder
    ...
  end
else
  class String
    ...
  end
end

이 예제에서는 라이브러리 기능이 존재하는지에 따라 완전히 다른 클래스 / 모듈을 제공합니다. 이를 통해 새로운 라이브러리 기능을 사용하는 완전히 다른 알고리즘을 사용하면서도 존재하지 않을 경우 충분히 근접하거나 덜 효율적인 알고리즘으로 대체 할 수 있습니다.

모든 중요한 이유

이게 당신을 어떻게 사나요? if명령문이 새로운 범위를 도입 한 경우, 새 메소드 또는 클래스는 if명령문 범위 내에서만 존재하고 사용됩니다 . 이러한 제약으로 인해 향후 1.9에서 마이그레이션 할 때 Ruby 2.0에 대한 변경이 필요한 라이브러리를 지원하기가 매우 어렵습니다.

연결 한 프리젠 테이션에 제공된 예제와 함께, 여러 버전의 Ruby를 계속 지원하면서 라이브러리에 대해 하나의 코드베이스를 유지하는 것이 추론입니다. 나는 그것이 Ruby 1.8과 Ruby 1.9 사이의 전환으로 인한 고통 때문에 태어 났다고 생각합니다. Ruby 팀은 꾸준히 2.0을 향해 나아가고 있지만, 호환되지 않는 변경 사항이있을 경우에도 사용자를 지원할 수 있습니다. 나는 1.9.1과 1.9.2 사이에 어떤 것이 있다고 생각합니다. 앞으로 더 많은 것이있을 것입니다.


1

나는 전문가가 아니지만 루비 FAQ를 보면 : http://arc.apotheon.org/ruby/faq/rubyfaq-2.php

2.3 "로컬 변수에 언제 액세스 할 수있게됩니까?" 현재 행동을 보여줍니다.

범위 지정 문제를 해결하기 위해 현재해야 할 약간의 "해킹"작업 중 하나는 다음과 같습니다.

이러한 로컬 변수의 동작으로 인해 방해받지 않도록 로컬 변수에 액세스하기 전에 = nil과 같은 대 입문을 넣는 것이 좋습니다.

나는 1.9가 이것을 수행 할 필요성을 제거 할 것이라고 믿으며 , 이것은 새로운 행동의 동인 중 하나 일 수있다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.