From e75627802aaffcf82ce75a19bbab990ab827f8ed Mon Sep 17 00:00:00 2001 From: marocchino Date: Mon, 10 Apr 2023 12:45:34 +0900 Subject: [PATCH] Translate faq 6 (ko) --- ko/documentation/faq/1/index.md | 2 +- ko/documentation/faq/2/index.md | 2 +- ko/documentation/faq/3/index.md | 2 +- ko/documentation/faq/4/index.md | 4 +- ko/documentation/faq/5/index.md | 2 +- ko/documentation/faq/6/index.md | 285 ++++++++++++++++++++++++++++++++ ko/documentation/faq/index.md | 4 +- 7 files changed, 293 insertions(+), 8 deletions(-) create mode 100644 ko/documentation/faq/6/index.md diff --git a/ko/documentation/faq/1/index.md b/ko/documentation/faq/1/index.md index ecfa521563..2743f1db0d 100644 --- a/ko/documentation/faq/1/index.md +++ b/ko/documentation/faq/1/index.md @@ -17,7 +17,7 @@ header: | | 5 | - 6 + 6 | 7 | diff --git a/ko/documentation/faq/2/index.md b/ko/documentation/faq/2/index.md index 0545a12435..33ec863700 100644 --- a/ko/documentation/faq/2/index.md +++ b/ko/documentation/faq/2/index.md @@ -17,7 +17,7 @@ header: | | 5 | - 6 + 6 | 7 | diff --git a/ko/documentation/faq/3/index.md b/ko/documentation/faq/3/index.md index 0b609bfba5..a9182fd420 100644 --- a/ko/documentation/faq/3/index.md +++ b/ko/documentation/faq/3/index.md @@ -17,7 +17,7 @@ header: | | 5 | - 6 + 6 | 7 | diff --git a/ko/documentation/faq/4/index.md b/ko/documentation/faq/4/index.md index 3539d4f41c..d6bae0c58d 100644 --- a/ko/documentation/faq/4/index.md +++ b/ko/documentation/faq/4/index.md @@ -17,7 +17,7 @@ header: | | 5 | - 6 + 6 | 7 | @@ -52,7 +52,7 @@ header: | 않습니다. 숫자 `42` 또는 상수 `true`를 보유한 변수는 실제로 값을 보유하는 것이지 참조를 보유하는 것이 아닙니다. 따라서 대입은 물리적으로 이러한 유형의 객체의 복사본을 생성합니다. 이에 대해서는 -[즉시 객체와 참조 객체](/en/documentation/faq/6/#immediate)에서 자세히 설명합니다. +[즉시 객체와 참조](../6/#immediate)에서 자세히 설명합니다. ### 지역 변수의 스코프는 무엇인가요? diff --git a/ko/documentation/faq/5/index.md b/ko/documentation/faq/5/index.md index 27f50bb88e..2608df556b 100644 --- a/ko/documentation/faq/5/index.md +++ b/ko/documentation/faq/5/index.md @@ -17,7 +17,7 @@ header: | | 5 | - 6 + 6 | 7 | diff --git a/ko/documentation/faq/6/index.md b/ko/documentation/faq/6/index.md new file mode 100644 index 0000000000..3cd217aeb4 --- /dev/null +++ b/ko/documentation/faq/6/index.md @@ -0,0 +1,285 @@ +--- +layout: page +title: "공식 Ruby FAQ" +lang: ko + +header: | +
+ 콘텐츠 + | + 1 + | + 2 + | + 3 + | + 4 + | + 5 + | + 6 + | + 7 + | + 8 + | + 9 + | + 10 + | + 11 +
+

공식 Ruby FAQ

+ +--- + +{% include faq-notice.md %} + +## 구문 + +### 즉시 값(immediate value)과 참조의 차이점은 무엇인가요? +{: #immediate} + +{% include faq-out-of-date.html %} + +`Fixnum`, `true`, `nil`, `false`는 즉시 값으로 구현되어 있습니다. 즉시 +값을 사용하면 변수는 객체에 대한 참조가 아니라 객체 자체를 보유합니다. + +이러한 객체에는 싱글톤 메서드를 정의할 수 없습니다. 동일한 값을 가진 두 개 +의 `Fixnum`은 항상 동일한 객체 인스턴스를 나타내므로, (예를 들어) 값이 +`1`인 `Fixnum`에 대한 인스턴스 변수는 시스템의 모든 '1'에 공유됩니다. 따라서 +이 중 하나에 대해서만 싱글톤 메서드를 정의하는 것은 불가능합니다. + +### `nil`과 `false`의 차이점은 무엇인가요? + +먼저 유사성부터 설명하겠습니다. `nil`과 `false`는 부울 컨텍스트에서 `false`로 +평가되는 유일한 두 개의 객체입니다. +(즉, 이 둘은 유일한 "falsy" 값이며 다른 모든 객체는 "truthy" 입니다.) + +그러나 `nil`과 `false`는 서로 다른 클래스(`NilClass`와 `FalseClass`)의 +인스턴스이며, 다른 곳에서는 다른 동작을 합니다. + +술어(predicate) 메서드(이름이 물음표로 끝나는 메서드)는 `true` 또는 `false`를 +반환하는 것이 좋습니다. 실패를 표시해야 하는 다른 메서드는 `nil`을 반환하는 +것이 좋습니다. + +### 빈 문자열이 `false`가 아닌 이유는 무엇인가요? + +Q: 조건 표현식에서 빈 문자열(`""`)이 `true`를 반환하던데요! Perl에서 +는 `false`였는데... + +A: 하지만 Ruby는 Perl이 아닙니다 ;-). Ruby에서는 조건부 컨텍스트에서 + `nil`과 `false`만 거짓입니다. + +`empty?`를 사용하거나 문자열을 `""`와 비교하거나 문자열의 `size`, `length`를 +`0`과 비교하여 문자열이 비어 있는지 확인할 수 있습니다. + +### `:name`은 무엇을 의미하나요? + +이름 뒤에 콜론을 붙이면 식별자와 일대일로 대응하는 심볼 객체가 생성됩니다. +프로그램이 실행되는 동안 주어진 이름이나 문자열에 대해 동일한 심볼 객체가 +생성됩니다. 심볼은 `"name".intern` 또는 `"name".to_sym`으로 생성할 수도 +있습니다. + +심볼 객체는 메서드, 변수 등에 대한 식별자를 나타낼 수 있습니다. +`define_method`, `method_missing`, `trace_var`와 같은 일부 메서드에는 심볼이 +필요합니다. 다른 메서드(예: `attr_accessor`, `send`, `autoload`)는 +문자열도 허용합니다. + +심볼은 한 번만 생성되기 때문에 해시 키로 자주 사용됩니다. 문자열 해시 키는 +매번 사용할 때마다 새 객체를 생성하므로 약간의 메모리 오버헤드가 발생합니다. +심볼 해시 키를 위한 특별한 구문도 있습니다. + +~~~ +person_1 = { :name => "John", :age => 42 } +person_2 = { name: "Jane", age: 24 } # 대안 문법 +~~~ + +심볼을 열거형 값으로 사용하거나 상수에 고유한 값을 할당하는 데에도 사용할 수 +있습니다. + +~~~ +status = :open # :closed, ... + +NORTH = :NORTH +SOUTH = :SOUTH +~~~ + +### 심볼의 값에 액세스하려면 어떻게 해야 하나요? + +심볼에 해당하는 변수의 값을 얻으려면 `symbol.to_s` 또는 `"#{심볼}"`을 +사용하여 변수 이름을 얻은 다음 심볼의 범위에서 이를 평가하여 변수의 내용 +을 얻을 수 있습니다. + +~~~ +a = "This is the content of `a'" +b = eval("#{:a}") +a.object_id == b.object_id # => true +~~~ + +다음을 사용할 수도 있습니다. + +~~~ +b = binding.local_variable_get(:a) +~~~ + +심볼이 메서드의 이름인 경우 `send`를 사용할 수 있습니다. + +~~~ +class Demo + def hello + "Hello, world" + end +end + +demo = Demo.new +demo.send(:hello) +~~~ + +또는 `Object#method`를 사용하여 해당 `Method` 객체를 반환한 다음 호출할 +수 있습니다. + +~~~ +m = demo.method(:hello) # => # +m.call # => "Hello, world" +~~~ + +### `loop`는 제어 구조인가요? + +`loop`는 제어 구조체처럼 보이지만 실제로는 `Kernel`에 정의된 메서드입니다. +loop 다음 블록은 지역 변수에 대한 새로운 스코프를 만듭니다. + +### Ruby에는 후 테스트(post-test) 루프가 없습니다. + +Q: Ruby에는 `do { ... } while` 구문이 없는데 마지막에 조건을 테스트하는 +루프를 어떻게 구현하나요? + +Clemens Hintze의 답변: Ruby의 `begin ... end`와 `while`, `until` 문 +수정자를 조합하여 동일한 효과를 얻을 수 있습니다. + +~~~ +i = 0 +begin + puts "i = #{i}" + i += 1 +end until i > 4 +~~~ + +결과: + +~~~ +i = 0 +i = 1 +i = 2 +i = 3 +i = 4 +~~~ + +### `p {}`의 경우 처럼 해시 리터럴을 메서드에 전달할 수 없는 이유는 무엇인가요? + +`{}`는 `Hash` 생성자가 아닌 블록으로 파싱됩니다. `p({})`처럼 매개변수라는 +사실을 명시하면 `{}`가 표현식으로 처리되도록 할 수 있습니다. + +### `def pos=(val)`가 작동하지 않습니다! + +다음과 같은 코드가 있지만 `pos = 1` 메서드를 사용할 수 없습니다. + +~~~ +def pos=(val) + @pos = val + puts @pos +end +~~~ + +`=`가 뒤에 붙은 메서드는 명시적 수신자와 함께 호출해야 합니다(수신자 +가 없으면 지역 변수에 할당하는 것뿐입니다). `self.pos = 1`로 +호출하세요. + +### `'\1'`과 `'\\1'`의 차이점은 무엇인가요? + +이들은 동일한 의미를 갖습니다. 작은따옴표로 묶인 문자열에서는 `\'`와 `\\`만 +변환되고 다른 조합은 변경되지 않습니다. + +그러나 큰따옴표로 묶인 문자열에서 `"\1"`은 바이트 `\001`(8진수 +비트 패턴)이고, `"\\1"`은 백슬래시와 문자 `"1"`이 포함된 두 문자로 된 +문자열입니다. + +### '..`와 '...`의 차이점은 무엇인가요? + +'...`는 범위에 오른쪽을 포함하지만 '...`는 포함하지 않습니다. + +~~~ +(5..8).to_a # => [5, 6, 7, 8] +(5...8).to_a # => [5, 6, 7] +~~~ + +### `or`와 `||`의 차이점은 무엇인가요? + +Q: `p(nil || "Hello")`는 `"Hello"`를 출력하지만 `p(nil or "Hello")`는 + 구문 분석 오류를 발생시킵니다. 왜 그럴까요? + +A: `or`의 우선순위가 너무 낮기 때문입니다, `p((nil 또는 "Hello") )`는 +작동합니다. + +`or`의 우선 순위는 `=`보다 낮지만 `||`의 우선 순위는 더 높습니다. + +~~~ +foo = nil || "Hello" # foo = (nil || "Hello") 로 해석 +foo # => "Hello" + +# 하지만 놀랍게도 + +foo = nil or "Hello" # (foo = nil) or "Hello" 로 해석 +foo # => nil +~~~ + +`or`(및 유사하게 `and`)은 부울 표현식을 결합하는 데 사용하는 것이 **아니라** +다음과 같은 제어 흐름에 사용하는 것이 가장 좋습니다. + +~~~ +do_something or raise "some error!" +~~~ + +여기서 `do_something`은 오류가 발생하면 `false` 또는 `nil`을 반환합니다. + +### Ruby에도 함수 포인터가 있나요? + +`Proc.new`, `proc`, `lambda`에 의해 생성된 `Proc` 객체는 변수에서 참조할 수 +있으므로 해당 변수는 함수 포인터라고 할 수 있습니다. 또한 특정 객체 인스턴스 +내의 메서드에 대한 참조는 `object.method`를 사용하여 얻을 수 있습니다. + +### `load`와 `require`의 차이점은 무엇인가요? + +`load`는 Ruby 프로그램(`*.rb`)을 로드하고 실행합니다. + +`require`는 Ruby 프로그램도 로드하지만 바이너리 Ruby 확장 모듈(공유 라이브러리 +또는 DLL)도 로드합니다. 거기에 더해 `require`는 기능이 두 번 이상 로드되지 +않도록 합니다. + +### Ruby에는 예외 처리가 있나요? + +Ruby는 유연한 예외 처리 체계를 지원합니다. + +~~~ +begin + statements which may raise exceptions +rescue [exception class names] + statements when an exception occurred +rescue [exception class names] + statements when an exception occurred +ensure + statements that will always run +end +~~~ + +`begin` 절에서 예외가 발생하면 일치하는 예외 이름을 가진 `rescue` 절이 실행 +됩니다. `ensure`절은 예외 발생 여부에 관계없이 실행됩니다. `rescue` 및 `ensure` +절은 생략할 수 있습니다. + +`rescue` 절에 대해 예외 클래스가 지정되지 않은 경우 묵시적으로 `StandardError` +예외를 가르키며, `StandardError`와 `is_a?` 관계에 있는 예외가 캡처됩니다. + +이 표현식은 `begin` 절의 값을 반환합니다. + +가장 최근의 예외는 전역 변수 `$!`에 의해 액세스가 가능합니다(따라서 `$!.type`을 +사용하여 유형을 확인할 수 있습니다). diff --git a/ko/documentation/faq/index.md b/ko/documentation/faq/index.md index cc9bc3fdb8..1e2e8c97ba 100644 --- a/ko/documentation/faq/index.md +++ b/ko/documentation/faq/index.md @@ -17,7 +17,7 @@ header: | | 5 | - 6 + 6 | 7 | @@ -54,7 +54,7 @@ Stollsteimer에게 감사드립니다. * [Ruby 설치하기](3/) * [변수, 상수, 인수](4/) * [이터레이터](5/) -* [구문](/en/documentation/faq/6/) +* [구문](6/) * [메서드](/en/documentation/faq/7/) * [클래스 및 모듈](/en/documentation/faq/8/) * [빌트인 라이브러리](/en/documentation/faq/9/)