我有一个像这样的数组
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
答案 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!