2017-10-20 149 views
-1

這是一個來自應用程序學院準備問題的問題 - 有人可以解釋答案。我不明白操作的順序在這個while循環是如何工作的:Ruby中的操作順序是什麼?

def dasherize_number(num) 
    i = 0 
    dashed = "" 
    num_s = num.to_s 

    while i < num_s.length 
    digit = num_s[i].to_i 
    if i > 0 
     prev_digit = num_s[i-1].to_i 
     if prev_digit%2 == 1 || digit%2 == 1 
     dashed += "-" ## THIS LINE COMES FIRST 

     end 
    end 

    dashed += num_s[i] ## WHY IS THIS ADDED TO "DASHED" FIRST? 

    i += 1 
    end 
    return dashed 
end 

puts(dasherize_number(32467743)) 

結果是3-245-7-7-4-3使所有的奇數有除了兩邊破折號最終案例。

對於我來說,插入短劃線的命令在原始字母后添加到新字符串中並沒有任何意義,即使它在代碼中位於第一位。

謝謝!

+0

你的意思[運算符優先級(https://開頭ruby- doc.org/core-2.2.0/doc/syntax/precedence_rdoc.html)?您應該逐步完成此代碼並更好地進行調試,並輸出每次迭代的結果。 – tadman

+0

提示:'digit.odd?'可能比模數技巧更易於理解。 – tadman

回答

0

在同時的塊的第一次迭代這個條件是不正確的

if i > 0 

但隨後該數字被添加到dashed,並從下一個迭代甚至條件爲真,這兩個東西放在一起可能是混亂你

+0

啊好吧,我陷入了困境。謝謝! –

0

我們來跟蹤while代碼的前兩個迭代。

i = 0 num_s = "32467743"

在while循環。

  • digit = 3i = 0if i > 0 is false,SO dashed = "3"
  • digit = 2i = 1prev_digit = 3if i > 0 is trueif prev_digit%2 == 1 || digit%2 == 1 is true,SO dashed = "3-",那麼代碼退出if i > 0塊,然後虛線正在更新dashed = 3-2

一切正常好吧,爲了。

0

以下是一些用於教育目的的替代解決方案。這一次使用odd?flat_map編譯的字符部分的數組,然後壓縮在一起,並剔除不必要的糠

def dasherize_number(num) 
    num.to_s.chars.map(&:to_i).flat_map do |d| 
    if (d.odd?) 
     [ '-', d, '-' ] 
    else 
     d 
    end 
    end.join('').gsub(/\-\-+/, '-').sub(/\A\-/, '').sub(/\-\z/, '') 
end 

這裏有一個通過連續應用幾次換人,以獲得定期的表達水平工作最終結果:

def dasherize_number(num) 
    { 
    /([13579])/ => '-\1-', 
    /\-\-+/ => '-', 
    /\A\-/ => '', 
    /\-\z/ => '' 
    }.inject(num.to_s) do |n, (rx, sub)| 
    n.gsub(rx,sub) 
    end 
end 
0

添加puts跟蹤會發生什麼:

def dasherize_number(num) 
    i = 0 
    dashed = "" 
    num_s = num.to_s 
    puts "number=#{num_s}" 

    while i < num_s.length 
    digit = num_s[i].to_i 
    if i > 0 
     prev_digit = num_s[i-1].to_i 
     puts "prev_digit=#{prev_digit} digit=#{digit}" 

     if prev_digit%2 == 1 || digit%2 == 1 
     dashed += "-" ## THIS LINE COMES FIRST 
     puts "dashed in if=#{dashed}" 
     end 
    end 

    dashed += num_s[i] ## WHY IS THIS ADDED TO "DASHED" FIRST? 
    puts "dashed + num=#{dashed}" 

    i += 1 
    end 
    return dashed 
end 

puts(dasherize_number(32467743)) 

執行:

$ ruby -w t.rb 
number=32467743 
dashed + num=3 
prev_digit=3 digit=2 
dashed in if=3- 
dashed + num=3-2 
prev_digit=2 digit=4 
dashed + num=3-24 
prev_digit=4 digit=6 
dashed + num=3-246 
prev_digit=6 digit=7 
dashed in if=3-246- 
dashed + num=3-246-7 
prev_digit=7 digit=7 
dashed in if=3-246-7- 
dashed + num=3-246-7-7 
prev_digit=7 digit=4 
dashed in if=3-246-7-7- 
dashed + num=3-246-7-7-4 
prev_digit=4 digit=3 
dashed in if=3-246-7-7-4- 
dashed + num=3-246-7-7-4-3 
3-246-7-7-4-3 

虛線+ = num_s [I] ##這是爲什麼加入到 「DASHED」 FIRST?

循環以i = 0開始,以便不執行if i > 0

虛線+ =「 - 」 ## THIS LINE至上

是,先在線,而不是在執行中,正是因爲它是在當時的塊取決於if i > 0的,這在第一次迭代期間不執行,允許dashed += num_s[i]將第一個數字添加到空的dashed字符串中。

dashed + num=3 

這只是在第二次迭代爲I = 1,使if i > 0爲真,並允許dashed += "-"要執行:

dashed in if=3-