2013-05-27 7 views
1

안녕하세요, 아래 코드에서 작성된지도 기능이 왜 쓰여지는지 설명해 줄 수 있는지 궁금합니다. 할 이유를 구체적으로 우리는중급 단계의 지역 변수

results = letters.map do |letter| encrypted_letter = encrypt_letter(letter) 

을 대신 단지

results = letters.map do |letter| encrypt_letter(letter) 

class Encryptor 
    def cipher 
    {"a" => "n", "b" => "o", 'c' => 'p', 'd' => 'q', 
      'e' => 'r', 'f' => 's', 'g' => 't', 'h' => 'u', 
     'i' => 'v', 'j' => 'w', 'k' => 'x', 'l' => 'y', 
     'm' => 'z', 'n' => 'a', 'o' => 'b', 'p' => 'c', 
     'q' => 'd', 'r' => 'e', 's' => 'f', 't' => 'g', 
     'u' => 'h', 'v' => 'i', 'w' => 'j', 'x' => 'k', 
     'y' => 'l', 'z' => 'm'} 
    end 

    def encrypt_letter(letter) 
     lowercase_letter = letter.downcase 
     cipher[lowercase_letter] 
    end 

    def encrypt(string) 
     letters = string.split("") 
     results = letters.map do |letter| 
      encrypted_letter = encrypt_letter(letter) 
     end 
     results.join 
    end 

    def decrypt_letter(letter) 
     lowercase_letter = letter.downcase 
     cipher.key(lowercase_letter) 
    end 

    def decrypt(string) 
     letters = string.split("") 
     results = letters.map do |letter| 
     decrypted_letter = decrypt_letter(letter) 
     end 

     results.join 
    end 

end 

답변

0

그것을위한 기능적인 이유가없는 일을 할 필요가있다. 때때로 프로그래머는 결과에 대해 명시적인 변수 대상을 갖는 것이 더 편하다고 느낍니다. 어쩌면이 경우 중 하나입니다. decrypted_letter 경우와 동일합니다.

+0

확인 감사합니다. 나는 꽤 오랫동안 그것을 알아 내려고 노력했다. – JaTo

+2

"때때로 프로그래머는 결과에 대해 명시적인 변수 대상을 갖는 것이 더 편하다고 느낍니다." 나는 그것을 더 간단하게 말하고 싶다 : 그것을 쓴 사람은'map'이 어떻게 작동하고 너무 자세하게 쓰는지 모른다. 중간 변수는 그 자리가 있지만 한 번만 사용되도록 지정하면 안됩니다. –

+0

@ The Tin Man ... 아무 곳에서도 좋은 연습이라고 제안하지 못했습니다. 나는 단지 관찰을하고 있었고 어느 ​​정도는 혀를보고 있었다. 필자는 프로그래머의 머리 속에서 어떤 일이 벌어지고 있는지 절대 생각하지 않을 것이다. – lurker

6

이유는 없습니다. 변수는 즉시 폐기됩니다.

필자는 오해의 소지가 있으며 위에 언급하지 않았다고 주장합니다. 대부분의 코드

예를 들어, 조금 자세한 보인다

def encrypt(string) 
    letters = string.split("") 
    results = letters.map do |letter| 
     encrypted_letter = encrypt_letter(letter) 
    end 
    results.join 
end 

이 IMO이 가까이 무언가로 더 루비 - 억양 다음과 같습니다

def encrypt(str) 
    str.chars.collect { |c| encrypt(c) }.join 
end 

그것은보다 엄격한 될 수있다, 또는 다른 방법으로 작성되었지만 일부는 선호도의 문제입니다. 예를 들어 each_with_object은 삽 운영자와 함께 사용할 수 있지만 기능이 적습니다. 일을 읽을 수 있도록하지 않습니다 더 라인을 통해 기능을 확산

하지만 상황에 따라 달라집니다;

은 (이상 경우 선호 내가 더 많은 의사 소통 찾을 수 있습니다. 수집 할 때 나는 map 이상 collect를 선호). Ruby 나 메소드 체이닝에 익숙하지 않은 사람들은 (IMO보다 표준적인) one-liner에 혼란 스러울 수 있습니다.

+0

대단한 답변입니다. 어떤 경우에 내가 더 의사 소통하기 위해 "지도"를 사용해야합니까? 지금까지 나는 그것을 수집에만 사용 해왔다. – JaTo

+0

@JamieS 내가 말했듯이, 그것은 개인적인 취향이다 -'map'은 잘 알려진 구조이고, 나는 단지'each'에 의미가 더 가까워 보인다. 그래서 나는 ' 적극적으로 결과를 수집하고, 나는 '수집'을 좋아한다.내 취향에 대한 기술적 인 이유가 없으며, 내가 선호하는 소수에 속할 수도 있습니다. 난 그저 내 예제에서 왜 그것을 사용했는지 설명하고 싶었다 :) –

+0

+1. 동의했다. 긴밀한 코드는 읽기 쉽고 일을 처리하는 데 시간을 낭비하지 않습니다. 단일 사용에 중간 값을 지정해도 가독성이 향상되지는 않지만 코드가 수행 할 작업에 대한 불확실성을 의미하고 인공적인 가독성을 제공하지만 시각적 인 혼란을 야기합니다. –

1

다른 사람들이 말하는 것처럼, 이유가 없습니다. 분명히 초보자가 작성한 코드입니다. Dave Newton의 요점에 덧붙여, 상수 해쉬를 메서드 cipher으로 정의하는 것은 나쁜 습관입니다. 코드가 호출 될 때마다 새 해시가 만들어집니다. 그리고 이것은 각 편지에 대해 수행되어야합니다. 그것은 엄청난 자원 낭비입니다.

h = {"a" => "n", "b" => "o", 'c' => 'p', 'd' => 'q', 
    'e' => 'r', 'f' => 's', 'g' => 't', 'h' => 'u', 
    'i' => 'v', 'j' => 'w', 'k' => 'x', 'l' => 'y', 
    'm' => 'z', 'n' => 'a', 'o' => 'b', 'p' => 'c', 
    'q' => 'd', 'r' => 'e', 's' => 'f', 't' => 'g', 
    'u' => 'h', 'v' => 'i', 'w' => 'j', 'x' => 'k', 
    'y' => 'l', 'z' => 'm'} 
h.default_proc = ->x{x} 

"hello world".gsub(/./, h) 
# => "uryyb jbeyq" 

을하지만 오히려이 갈 것입니다 :

해시를 사용하면 간단하게이 작업을 수행 할 수 있습니다

from = "abcdefghijklmnopqrstuvwxyz" 
to = "nopqrstuvwxyzabcdefghijklm" 

"hello world".tr(from, to) 
# => "uryyb jbeyq"