-3

我有一个这样的数组

array = ["a", nil, "b"]

当我join像这样运行它时

result = array.join

并且putsresult我得到“ab”,而不是“ab”。

帮助!

编辑请在我的实际代码的上下文中理解这一点:

def caesar_cipher(initial_string, shift_number)
    letter_list = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']

    modified_initial_string = initial_string.split("")
    modified_initial_string.map! { |letter|
        letter.downcase!
        if letter_list.include?(letter)
            letter = letter_list[letter_list.index(letter) - shift_number]
        end
    }
    result = modified_initial_string.join
    puts modified_initial_string
    puts result
end
caesar_cipher("Hello this", 1)

我在终端的结果是:

g
d
k
k
n

s
g
h
r
gdkknsghr
4

3 回答 3

2

Array#join按预期工作:

>> array = ["a", " ", "b"]
=> ["a", " ", "b"]
>> array.join
=> "a b"
>> puts array.join
a b

更新:完整代码

你没有考虑else大小写。

def caesar_cipher(initial_string, shift_number)
    letter_list = (?a..?z).to_a

    initial_string.each_char.map { |letter|
        letter.downcase!
        if letter_list.include?(letter)
            letter_list[letter_list.index(letter) - shift_number]
        else
            letter
        end
    }.join
end

puts caesar_cipher("Hello this", 1)
于 2013-10-20T07:36:14.567 回答
1

我想答案已经有了答案,最好的办法是.join(' ')最后加入数组。

我建议您在其中添加一些 Ruby 风味:

def caesar_cipher(initial_string, shift_number)
  initial_string.split.map do |x|
    x.each_char.map { |y| (y.ord - shift_number).chr }.join
    #above shifts in ascii for you
  end.join(' ')
end

caesar_cipher("Hello World", 1)
=> "Gdkkn Vnqkc"

#ord给你一个字符的 ascii,而#chr将一个整数转换回它的 ascii 字符等价物。

此外,在您的代码中,最好替换:

letter_list = ['a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z']

和:

letter_list = ('a'..'z').to_a

红宝石FTW!

于 2013-10-20T07:56:07.683 回答
1

那是因为它不是" "in modified_initial_string

puts modified_initial_string.inspect
# ["g", "d", "k", "k", "n", nil, "s", "g", "h", "r"]
#                           ^^^

并将s.join从.nilresult

nil来自未包含在 中的空格,letter_list因此它们失败了if. 所以,如果你想保留它们,你需要为它们添加一个替代条件:

if letter_list.include?(letter)
    # ...
elsif letter == " "
   letter
end
于 2013-10-20T07:43:31.760 回答