Skip to content

Update translation of "Ruby FAQ 5", "Ruby FAQ 6" (ko) #3037

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Apr 15, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion ko/documentation/faq/2/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -68,7 +68,7 @@ Ruby의 객체 지향 순수성은 Python에는 부족하거나 Python이 여전
할 수 있고, 그러면 해당 모듈의 메서드, 상수 등이 클래스에 삽입됩니다.

Ruby는 또 Smalltalk와 마찬가지로 클로저와 코드 블록을 제공하고 동일한 효과를
위해 사용합니다. Ruby 컬렉션 클래스와 반복자는 Python이 싹트고 있는
위해 사용합니다. Ruby 컬렉션 클래스와 이터레이터는 Python이 싹트고 있는
임시방편(람다, 리스트 컴프리헨션)보다 뛰어나고 훨씬 강력하고 우아합니다.

Ruby의 구문과 디자인 철학은 Perl의 영향을 많이 받았습니다. 문법적 변동성이
Expand Down
19 changes: 9 additions & 10 deletions ko/documentation/faq/5/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@ end
~~~

배열 `data`의 each 메서드에는 `do ... end` 블록이 전달되어 반복적으로
실행됩니다. 호출할 때마다 블록은 배열의 연속적인 요소를 전달받습니다.
실행됩니다. 호출할 때마다 블록은 배열의 요소를 차례로 전달받습니다.

블록을 정의할 때 `do ... end` 대신 `{ ... }`를 쓸 수 있습니다.

Expand All @@ -81,30 +81,30 @@ data.each { |i|
3
~~~

이 코드는 예제와 동일한 의미를 갖습니다. 그러나 경우에 따라 우선순위
이 코드는 앞의 예제와 동일한 의미를 갖습니다. 그러나 경우에 따라 우선순위
문제로 인해 `do ... end`와 `{ ... }`가 다르게 동작할 수 있습니다.

~~~
foobar a, b do ... end # foobar가 이터레이터.
foobar a, b { ... } # b가 이터레이터.
~~~

이는 `{ ... }` `do ... end` 블록보다 앞의 표현식에 더 강하게 바인딩되기
이는 `{ ... }` `do ... end` 블록보다 앞의 표현식에 더 강하게 바인딩되기
때문입니다. 첫 번째 예는 `foobar(a, b) do ... end`와 같고, 두 번째 예는
`foobar(a, b { ... })`와 같습니다.

### 블록을 이터레이터에 전달하려면 어떻게 해야 하나요?

반복자 호출 뒤에 블록을 배치하기만 하면 됩니다. `Proc`을 참조하는 변수나 상수
이터레이터 호출 뒤에 블록을 배치하기만 하면 됩니다. `Proc`을 참조하는 변수나 상수
이름 앞에 `&`를 붙여 `Proc` 객체를 전달할 수도 있습니다.

### 블록은 이터레이터에서 어떻게 사용되나요?

{% include faq-out-of-date.html %}

이터레이터 메서드에서 블록을 실행하는 방법에는 세 가지가 있습니다:
이터레이터 메서드에서 블록을 실행하는 방법에는 세 가지가 있습니다.
(1) `yield` 제어 구조, (2) `call`을 사용하여 (블록으로 만든) `Proc` 인자를
호출하는 것, (3) `Proc.new`를 사용한 후 호출하는 것 등이 있습니다.
호출하는 것, (3) `Proc.new`를 사용한 후 호출하는 것입니다.

`yield` 문은 블록을 호출하며, 하나 이상의 인수를 전달할 수 있습니다.

Expand Down Expand Up @@ -146,7 +146,7 @@ my_iterator {|a, b| puts a, b }
메서드에 주어진 블록을 인수로 받아 프로시저 객체를 생성합니다. (`proc`과
`lambda`는 사실상 동의어입니다.)

_[업데이트 필요: `lambda`는 약간 다른 방식으로 작동하며 블록 없이 Proc 객체를
_[업데이트 필요: `lambda`는 약간 다른 방식으로 작동하며, 블록 없이 Proc 객체를
생성하려고 시도했습니다(`tried to create Proc object without a block`)라는
경고가 표시됩니다.]_

Expand Down Expand Up @@ -174,7 +174,7 @@ my_iterator {|a, b| puts a, b }
놀랍게도 `Proc.new`와 친구들은 메서드에 연결된 블록을 전혀 소비하지 않으며,
`Proc.new`를 호출할 때마다 동일한 블록에서 새 프로시저 객체를 생성합니다.

블록이 메서드와 연관되어 있는지 여부는 `block_given?`을 호출하여 확인할 수
메서드에 연관된 블록이 있는지 여부는 `block_given?`을 호출하여 확인할 수
있습니다.

### 블록이 없는 `Proc.new`는 어떤 기능을 하나요?
Expand All @@ -183,11 +183,10 @@ my_iterator {|a, b| puts a, b }
그러나 메서드 정의에서 블록이 없는 `Proc.new`는 메서드가 호출될 때 블록이
존재한다는 것을 의미하므로 오류가 발생하지 않습니다.


### 이터레이터를 병렬로 실행하려면 어떻게 해야 하나요?

여기 [\[ruby-talk:5252\]][ruby-talk:5252]에서 Matz가 스레드를 사용하는 해결책을
채택했습니다.
가져왔습니다.

~~~
require "thread"
Expand Down
60 changes: 30 additions & 30 deletions ko/documentation/faq/6/index.md
Original file line number Diff line number Diff line change
Expand Up @@ -45,16 +45,16 @@ header: |
`Fixnum`, `true`, `nil`, `false`는 즉시 값으로 구현되어 있습니다. 즉시
값을 사용하면 변수는 객체에 대한 참조가 아니라 객체 자체를 보유합니다.

이러한 객체에는 싱글톤 메서드를 정의할 수 없습니다. 동일한 값을 가진 두
`Fixnum`은 항상 동일한 객체 인스턴스를 나타내므로, (예를 들어) 값이
`1`인 `Fixnum`에 대한 인스턴스 변수는 시스템의 모든 '1'에 공유됩니다. 따라서
이러한 객체에는 싱글턴 메서드를 정의할 수 없습니다. 동일한 값을 가진 두 개의
`Fixnum`은 항상 동일한 객체 인스턴스를 나타내므로, (예를 들어) 값이
`1`인 `Fixnum`에 대한 인스턴스 변수는 시스템의 모든 `1`에 공유됩니다. 따라서
이 중 하나에 대해서만 싱글톤 메서드를 정의하는 것은 불가능합니다.

### `nil`과 `false`의 차이점은 무엇인가요?

먼저 유사성부터 설명하겠습니다. `nil`과 `false`는 부울 컨텍스트에서 `false`로
먼저 유사성부터 설명하겠습니다. `nil`과 `false`는 컨텍스트에서 `false`로
평가되는 유일한 두 개의 객체입니다.
(즉, 이 둘은 유일한 "falsy" 값이며 다른 모든 객체는 "truthy" 입니다.)
(즉, 이 둘은 유일한 "falsy" 값이며 다른 모든 객체는 "truthy"입니다.)

그러나 `nil`과 `false`는 서로 다른 클래스(`NilClass`와 `FalseClass`)의
인스턴스이며, 다른 곳에서는 다른 동작을 합니다.
Expand All @@ -65,13 +65,13 @@ header: |

### 빈 문자열이 `false`가 아닌 이유는 무엇인가요?

Q: 조건 표현식에서 빈 문자열(`""`)이 `true`를 반환하던데요! Perl에서
`false`였는데...
Q: 조건 표현식에서 빈 문자열(`""`)이 `true`를 반환하던데요! Perl에서는
`false`였는데...

A: 하지만 Ruby는 Perl이 아닙니다 ;-). Ruby에서는 조건부 컨텍스트에서
`nil`과 `false`만 거짓입니다.
A: 하지만 Ruby는 Perl이 아닙니다. ;-) Ruby에서는 조건부 컨텍스트에서
`nil`과 `false`만 거짓입니다.

`empty?`를 사용하거나 문자열을 `""`와 비교하거나 문자열의 `size`, `length`를
`empty?`를 사용하거나, 문자열을 `""`와 비교하거나, 문자열의 `size`, `length`를
`0`과 비교하여 문자열이 비어 있는지 확인할 수 있습니다.

### `:name`은 무엇을 의미하나요?
Expand Down Expand Up @@ -107,9 +107,9 @@ SOUTH = :SOUTH

### 심볼의 값에 액세스하려면 어떻게 해야 하나요?

심볼에 해당하는 변수의 값을 얻으려면 `symbol.to_s` 또는 `"#{심볼}"`을
사용하여 변수 이름을 얻은 다음 심볼의 범위에서 이를 평가하여 변수의 내용
얻을 수 있습니다.
심볼에 해당하는 변수의 값을 얻으려면 `symbol.to_s` 또는 `"#{symbol}"`을
사용하여 변수 이름을 얻은 다음 심볼의 스코프에서 이를 평가하여 변수의 내용을
얻을 수 있습니다.

~~~
a = "This is the content of `a'"
Expand All @@ -136,7 +136,7 @@ demo = Demo.new
demo.send(:hello)
~~~

또는 `Object#method`를 사용하여 해당 `Method` 객체를 반환한 다음 호출할
또는 `Object#method`를 사용하여 해당 `Method` 객체를 반환하게 한 다음 호출할
수 있습니다.

~~~
Expand All @@ -147,9 +147,9 @@ m.call # => "Hello, world"
### `loop`는 제어 구조인가요?

`loop`는 제어 구조체처럼 보이지만 실제로는 `Kernel`에 정의된 메서드입니다.
loop 다음 블록은 지역 변수에 대한 새로운 스코프를 만듭니다.
loop 뒤에 오는 블록은 지역 변수에 대한 새로운 스코프를 만듭니다.

### Ruby에는 테스트(post-test) 루프가 없습니다.
### Ruby에는 사후 테스트(post-test) 루프가 없습니다.

Q: Ruby에는 `do { ... } while` 구문이 없는데 마지막에 조건을 테스트하는
루프를 어떻게 구현하나요?
Expand All @@ -175,7 +175,7 @@ i = 3
i = 4
~~~

### `p {}`의 경우 처럼 해시 리터럴을 메서드에 전달할 수 없는 이유는 무엇인가요?
### `p {}`의 경우처럼 해시 리터럴을 메서드에 전달할 수 없는 이유는 무엇인가요?

`{}`는 `Hash` 생성자가 아닌 블록으로 파싱됩니다. `p({})`처럼 매개변수라는
사실을 명시하면 `{}`가 표현식으로 처리되도록 할 수 있습니다.
Expand Down Expand Up @@ -204,9 +204,9 @@ end
비트 패턴)이고, `"\\1"`은 백슬래시와 문자 `"1"`이 포함된 두 문자로 된
문자열입니다.

### '..`와 '...`의 차이점은 무엇인가요?
### `..`와 `...`의 차이점은 무엇인가요?

'...`는 범위에 오른쪽을 포함하지만 '...`는 포함하지 않습니다.
`..`는 범위의 오른쪽 항을 포함하지만 `...`는 포함하지 않습니다.

~~~
(5..8).to_a # => [5, 6, 7, 8]
Expand All @@ -216,9 +216,9 @@ end
### `or`와 `||`의 차이점은 무엇인가요?

Q: `p(nil || "Hello")`는 `"Hello"`를 출력하지만 `p(nil or "Hello")`는
구문 분석 오류를 발생시킵니다. 왜 그럴까요?
구문 분석 오류를 발생시킵니다. 왜 그럴까요?

A: `or`의 우선순위가 너무 낮기 때문입니다, `p((nil 또는 "Hello") )`는
A: `or`의 우선순위가 너무 낮기 때문입니다, `p( (nil or "Hello") )`는
작동합니다.

`or`의 우선 순위는 `=`보다 낮지만 `||`의 우선 순위는 더 높습니다.
Expand All @@ -233,7 +233,7 @@ foo = nil or "Hello" # (foo = nil) or "Hello" 로 해석
foo # => nil
~~~

`or`(및 유사하게 `and`)은 부울 표현식을 결합하는 데 사용하는 것이 **아니라**
`or`(및 유사하게 `and`)는 불 표현식을 결합하는 데 사용하는 것이 **아니라**
다음과 같은 제어 흐름에 사용하는 것이 가장 좋습니다.

~~~
Expand All @@ -250,10 +250,10 @@ do_something or raise "some error!"

### `load`와 `require`의 차이점은 무엇인가요?

`load`는 Ruby 프로그램(`*.rb`)을 로드하고 실행합니다.
`load`는 Ruby 프로그램(`*.rb`)을 불러오고 실행합니다.

`require`는 Ruby 프로그램도 로드하지만 바이너리 Ruby 확장 모듈(공유 라이브러리
또는 DLL)도 로드합니다. 거기에 더해 `require`는 기능이 두 번 이상 로드되지
`require`는 Ruby 프로그램도 불러오지만 바이너리 Ruby 확장 모듈(공유 라이브러리
또는 DLL)도 불러옵니다. 거기에 더해 `require`는 기능을 두 번 이상 불러오지
않도록 합니다.

### Ruby에는 예외 처리가 있나요?
Expand All @@ -272,14 +272,14 @@ ensure
end
~~~

`begin` 절에서 예외가 발생하면 일치하는 예외 이름을 가진 `rescue` 절이 실행
됩니다. `ensure`절은 예외 발생 여부에 관계없이 실행됩니다. `rescue` 및 `ensure`
절은 생략할 수 있습니다.
`begin` 절에서 예외가 발생하면 일치하는 예외 이름을 가진 `rescue` 절이
실행됩니다. `ensure` 절은 예외 발생 여부에 관계없이 실행됩니다. `rescue` 및
`ensure` 절은 생략할 수 있습니다.

`rescue` 절에 대해 예외 클래스가 지정되지 않은 경우 묵시적으로 `StandardError`
예외를 가르키며, `StandardError`와 `is_a?` 관계에 있는 예외가 캡처됩니다.
예외를 가리키며, `StandardError`와 `is_a?` 관계에 있는 예외가 캡처됩니다.

이 표현식은 `begin` 절의 값을 반환합니다.

가장 최근의 예외는 전역 변수 `$!`에 의해 액세스가 가능합니다(따라서 `$!.type`을
가장 최근의 예외는 전역 변수 `$!`을 통해 액세스가 가능합니다(따라서 `$!.type`을
사용하여 유형을 확인할 수 있습니다).