만약 문이 루비 1.9 에서 범위를 소개하지 않는다면 , 루비 1.8에서이 변화의 근거는 무엇입니까?
만약 문이 루비 1.9 에서 범위를 소개하지 않는다면 , 루비 1.8에서이 변화의 근거는 무엇입니까?
답변:
루비 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 사이에 어떤 것이 있다고 생각합니다. 앞으로 더 많은 것이있을 것입니다.
나는 전문가가 아니지만 루비 FAQ를 보면 : http://arc.apotheon.org/ruby/faq/rubyfaq-2.php
2.3 "로컬 변수에 언제 액세스 할 수있게됩니까?" 현재 행동을 보여줍니다.
범위 지정 문제를 해결하기 위해 현재해야 할 약간의 "해킹"작업 중 하나는 다음과 같습니다.
이러한 로컬 변수의 동작으로 인해 방해받지 않도록 로컬 변수에 액세스하기 전에 = nil과 같은 대 입문을 넣는 것이 좋습니다.
나는 1.9가 이것을 수행 할 필요성을 제거 할 것이라고 믿으며 , 이것은 새로운 행동의 동인 중 하나 일 수있다.