문제

내가 Ruby를 배우는 초보자입니까, 아니면 Java/C#보다 더 많은 글을 쓰는 방법이 있습니까? 또한 Java보다 유연하다면 Ruby의 언어 적 특징이 일반적으로 있습니까? ~ 아니다 혼란을 피하는 데 사용 되었습니까?

예는 평행 할당과 문자열을 작성하는 모든 다른 방법 일 수 있습니까?

메모: 나는 Java/C#과 비교를 요구하지 않습니다 ...이 언어 질문 만하십시오 ... 제발 ...

편집하다: C#, Java 및 Ruby는 강력하게 입력되었으며 Ruby (Python 및 다른 사람들과 같은) 만 동적으로 입력 한 반면 (Java/C#은 정적으로 입력) 동적으로 입력된다는 것을 알고 있습니다. 일부 답변 중 일부는 동적으로 유형 된 언어가 더 유연하다고 말합니다. 이것이 반드시 사실이며 구문에 어떤 영향을 미칩니 까? 나는 구문 유연성에 대해서만 묻고 있습니다.

(PHP는 또한 동적으로 입력되며 그렇게합니다 ~ 아니다 내가 본 한 Java/C#보다 유연 해 보입니다. 다시 말하지만, 나는 구문 측면에서 배포 나 다른 측면이 아니라 ...)

도움이 되었습니까?

해결책

나는 Java 또는 C#을 모르지만, 숫자에 대한 + 작동 방식을 재정의 할 수 있다는 사실을 알렸다.

다른 팁

저에게 Ruby에서 가장 많이 사용되는 기능과 Java에서 누락 된 기능은 코드 블록/람다/클로저입니다.

또 다른 위대한 (그러나 위험한) 기능은 오픈 클래스입니다. 원하는 클래스를 변경할 수 있습니다. 새 방법을 추가하고 오래된 변경 등을 변경합니다. 전체 클래스가 아닌 특정 객체에 메소드를 추가 할 수도 있습니다 :).

루비와 상당히 유사한 또 다른 역동적 인 언어는 파이썬입니다. 그러나, 파이썬의 선, 규칙 중 하나는 규칙이 "무언가를하는 방법과 하나만 있어야한다"고 지시합니다. 이것은 루비와 정반대의 정반대이며,이 메타 프로그래밍이 너무 많아서 본질적으로 같은 일을하는 무한한 수의 방법이 있습니다.

즉, Python 3.0 (일명 : 3000) 문자열과 유니 코드 값이 다른 유형이 될 때까지 다소 아이러니 한 것입니다. 의미가 있지만 사람들은 때때로 텍스트 작업을 수행하기 위해 두 사람 사이를 많이 전환하는 문제에 들어갑니다.

선택의 여지가 있다면 Python을 동적 언어 소개로 사용하는 것이 좋습니다. 루비에는 아무런 문제가 없지만 "올바른"방법이 완전히 분명하지 않은 더 적은 상황에 빠질 것입니다.

PHP가 동적으로 입력하는 것에 대한 응답으로 :

PHP의 유형 시스템은 유연하여 유형이 사용 된 컨텍스트에 따라 유형을 자동으로 변환 할 수 있습니다. 그러나 실제로는 실제 동적 유형을 만들지는 않습니다. 언어 자체는 대부분 정적이며 런타임시 객체에 속성을 추가 할 수 없습니다 (예 : 마지막으로 확인한 마지막 시간).

Python, 그리고 아마도 Ruby는 실제로 강력하게 입력되었으므로 자신있게 비교를 유형 할 수 있으며 숫자를 얻기 위해 숫자 문자열을 추가하는 것과 같은 PHP 트릭을 수행 할 수 없습니다. 실제 동적 언어는 종종 인스턴스 또는 클래스 유형을 조정하거나 런타임에 속성을 추가 할 수있는 메타 클래스를 허용합니다.

루비는 역동적 인 언어입니다. C#과 Java는 모두 강력한 타이핑을 가진 정적으로 입력 한 언어입니다. v4.0의 C#은 동적 기능을 추가 할 것이지만 지금까지 Java와 C#은 Ruby 및 Python과 같은 동적 언어와는 완전히 다르고 엄격한 패러다임을 가졌습니다.

나는 람다의 위의 RKJ의 답변에 대해 언급했다. 이 코드는 귀하가 요청한 예를 보여줍니다.

def abs(n); (n < 0) ? -n : n; end
def square(n); n * n; end
def average(x, y); (x + y) / 2; end

def fixed_point(x, point, process, test)
  return point if test.call(x, point)
  fixed_point(x, process.call(x, point), process, test)
end

def sqrt(n)
  process = lambda {|n,g| average g, (n/g) }
  test = lambda {|n,g| abs(square(g) - n) < 0.001} 
  fixed_point(n, 1.0, process, test)
end

주목해야 할 첫 번째 요점은 fixed_point 메소드는 특정 테스트가 통과 될 때까지 일부 데이터에 프로세스를 점차적으로 적용한다는 일반적인 아이디어를 처리합니다. 그만큼 sqrt 기능은 제곱근과 테스트를 찾는 과정을 정의하여 언제 만족 해야하는지 결정합니다. 이러한 '절차'는 다른 형태의 데이터와 마찬가지로 전달됩니다. fixed_point 마법 일 수 있습니다.

프로세스를 일시적으로 저장하고 테스트하는 대신 모든 것이 익명 일 수 있습니다. 우리는 다시 쓸 수 있습니다 sqrt 처럼;

def sqrt(n)
  fixed_point( n, 1.0, 
      lambda {|n,g| average g, (n/g)},
      lambda {|n,g| abs(square(g) - n) < 0.001} )
end

이 능력이 없으면 프로세스와 테스트를 개별 기능으로 정의하고 특별한 기능을 만들어야합니다. sqrt_fixed_point 그들을 부르는 기능. 내가 알고있는 한 Java는 Functors를 사용하여 비슷한 일을 할 수 있지만 의견을 제시 할만 큼 충분히 알지 못합니다. 내가 블로그 나 이와 유사하게 본 합의는 Java가 이것을 너무 끔찍하게 복잡하게 만들어서 코피를 시도해 볼 수 있다는 것입니다.

물론 루비가 제공하는 또 다른 옵션은 메타 프로 그램입니다. 다시 작성할 수 있습니다 sqrt 다시 쓰기 (즉, 즉) fixed_point 올바른 프로세스와 테스트를 사용하지만 이것은 아마도 기능의 남용 일 것입니다 :-)

추신. Joelonsoftware 링크는 반복 할 자격이 있습니다. http://www.joelonsoftware.com/items/2006/08/01.html

동적으로 입력 한 모든 언어 (Ruby와 같은)는 일반적으로 정적으로 입력 한 언어 (Java와 같은)보다 유연합니다. 당신은 유형 시스템과 싸울 필요가 없으며, 종종 정적으로 입력 한 언어로 끝납니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top