如何使用nil条目连接数组,即[“a”,nil,“b”]将nil视为空格

时间:2013-10-20 07:35:01

标签: ruby

我有一个像这样的数组

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

当我像这样运行join

result = array.join

puts result,我得到“ab”,而不是“a b”。

帮助!

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

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

3 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

那是因为它不是" "中的modified_initial_string

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

并且.join会从nil中删除result

nil来自letter_list未包含的空格,因此if失败。因此,如果您想保留它们,您需要为它们添加备用条件:

if letter_list.include?(letter)
    # ...
elsif letter == " "
   letter
end

答案 2 :(得分: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']

with:

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

Ruby FTW!