2014-09-04 40 views
2

一個變量我有這個if語句:舉一個if語句在Ruby中

if value_n_in_f > 0 && value_m_in_f != 1 
    puts "I: f(x)=#{value_m_in_f}x+#{value_n_in_f}" 
    elsif value_n_in_f == 0 && value_m_in_f != 1 
    puts "I: f(x)=#{value_m_in_f}x" 
    elsif value_n_in_f < 0 && value_m_in_f != 1 
    puts "I: f(x)=#{value_m_in_f}x#{value_n_in_f}" 
    elsif value_n_in_f > 0 && value_m_in_f == 1 
    puts "I: f(x)=x+#{value_n_in_f}" 
    elsif value_n_in_f == 0 && value_m_in_f == 1 
    puts "I: f(x)=x" 
    elsif value_n_in_f < 0 && value_m_in_f == 1 
    puts "I: f(x)=x#{value_n_in_f}" 
    end` 

我不得不在其他語句真正經常使用這一說法,它使我的代碼不必要的長時間。很明顯if_for_f =如果.......結束將不起作用。有沒有其他方法? 這是我希望它看起來像一個例子:

puts "Now we insert #{value_of_x} in #{if_for_f}" 

有什麼辦法,我可以做這樣的事情?請注意,我絕對是這個新手。

由於提前, Kaiton

+1

你可以寫一個叫'if_for_f'函數,它在任何需要的值。 – tadman 2014-09-04 21:37:28

+1

它在我看來,條件看起來凌亂的(唯一的)原因是因爲變量名'value_n_in_f'和'value_m_in_f'很長且不尋常。如果你讓他們成爲一個單一的字母,那會讓它看起來很簡單。其實,你的問題並不清楚。 – sawa 2014-09-04 22:06:06

+0

只是想提一提你的「明顯」聲明實際上是不正確的。你可以將一個'if'語句的結果賦給一個變量。並不是說你應該在這裏,但它是可能的 - 就像J-Dizzle將一個'case'語句的結果賦給一個變量一樣。 – 2014-09-04 23:03:26

回答

4

我不能只是一個高清與它的功能s函數運行這個case 聲明並調用它然後當我需要它時呢?

當然:

def do_stuff(m, n) 
    if m == 1 
    if n > 0  then "I: f(x)=x+#{n}" 
    elsif n == 0 then "I: f(x)=x" 
    elsif n < 0 then "I: f(x)=x#{n}" 
    end 
    else 
    if n > 0  then "I: f(x)=#{m}x+#{n}" 
    elsif n == 0 then "I: f(x)=#{m}x" 
    elsif n < 0 then "I: f(x)=#{m}x#{n}" 
    end 
    end 
end 

puts do_stuff(1, 1) #I: f(x)=x+1 

或者,如果緻密性的目標,我們可以得到這樣的:

def do_stuff(m, n) 
    if m == 1 
    n == 0 ? "I: f(x)=x"  : "I: f(x)=x#{sprintf("%+d", n)}" 
    else 
    n == 0 ? "I: f(x)=#{m}x" : "I: f(x)=#{m}x#{sprintf("%+d", n)}" 
    end 
end 

...然後一個一個襯墊:

def do_stuff(m, n) 
    (m == 1) ? (n == 0 ? "I: f(x)=x" : "I: f(x)=x#{sprintf("%+d", n)}") : (n == 0 ? "I: f(x)=#{m}x" : "I: f(x)=#{m}x#{sprintf("%+d", n)}") 
end 
end 

但是你的方法有零和-1的一些問題:

def do_stuff(value_m_in_f, value_n_in_f) 
if value_n_in_f > 0 && value_m_in_f != 1 
    puts "I: f(x)=#{value_m_in_f}x+#{value_n_in_f}" 
    elsif value_n_in_f == 0 && value_m_in_f != 1 
    puts "I: f(x)=#{value_m_in_f}x" 
    elsif value_n_in_f < 0 && value_m_in_f != 1 
    puts "I: f(x)=#{value_m_in_f}x#{value_n_in_f}" 
    elsif value_n_in_f > 0 && value_m_in_f == 1 
    puts "I: f(x)=x+#{value_n_in_f}" 
    elsif value_n_in_f == 0 && value_m_in_f == 1 
    puts "I: f(x)=x" 
    elsif value_n_in_f < 0 && value_m_in_f == 1 
    puts "I: f(x)=x#{value_n_in_f}" 
    end 
end 

do_stuff(1, 0) 
do_stuff(1,-1) 
do_stuff(1, 1) 
do_stuff(0,-1) 
do_stuff(0, 0) 
do_stuff(-1, 1) 

--output:-- 
I: f(x)=x 
I: f(x)=x-1 
I: f(x)=x+1 
I: f(x)=0x-1 #<---HERE 
I: f(x)=0x  #<---HERE 
I: f(x)=-1x+1 #<---HERE 

所以我們進行了修復:

def get_line_equ(m, b) 
    constant = (b == 0) ? "" : sprintf("%+d", b) # 2 => "+2" 

    case m 
    when 0 
    xterm = "" 
    constant = b 
    when 1 
    xterm = "x" 
    when -1 
    xterm = "-x" 
    else 
    xterm = "#{m}x" 
    end 

    "I: f(x)=#{xterm}#{constant}" 
end 

puts get_line_equ(0, 0) 
puts get_line_equ(0, -1) 
puts get_line_equ(0, 1) 

puts get_line_equ(1, 0) 
puts get_line_equ(1,-1) 
puts get_line_equ(1, 1) 

puts get_line_equ(-1, 0) 
puts get_line_equ(-1, -1) 
puts get_line_equ(-1, 1) 

puts get_line_equ(2, 0) 
puts get_line_equ(2, -1) 
puts get_line_equ(2, 1) 

--output:-- 
I: f(x)=0 
I: f(x)=-1 
I: f(x)=1 
I: f(x)=x 
I: f(x)=x-1 
I: f(x)=x+1 
I: f(x)=-x 
I: f(x)=-x-1 
I: f(x)=-x+1 
I: f(x)=2x 
I: f(x)=2x-1 
I: f(x)=2x+1 

更好?

擾流:

最終DEF是效率不高,因爲它可以是:第一行應被刪除,並複製到每個時分支 - 除了第一。

在迴應評論:

def my_sprintf(str, *numbers) 
    str.gsub(/% .*? [df]/x) do |match| #Looks for %...d or %...f sequences 
    puts match 
    end 
end 

my_sprintf("The answer is: %+d or %+d", -2, 3) 


--output:-- 
%+d 
%+d 

下一頁:

def my_sprintf(str, *numbers) 

    str.gsub(/% .*? [df]/x) do |format_sequ| 
    number_as_str = numbers.shift.to_s 
    p number_as_str 

    if format_sequ[1] == "+" and number_as_str[0] != "-" 
     "+#{number_as_str}" 
    else 
     number_as_str 
    end 

    end 
end 

puts my_sprintf("The answer is: %+d or %+d.", -2, 3) 

--output:-- 
"-2" 
"3" 
The answer is: -2 or +3. 
+0

謝謝,但什麼是sprintf? – Kaiton 2014-09-06 22:59:32

+0

好吧,我想我現在理解sprintf。我有一個問題,雖然我想分數,但當我打電話給sprintf {「%+ f」,1.5}我得到=> 1.50000000,我怎麼能讓它像通常的分數一樣,只顯示我給他的數字?其次。有人可以解釋,爲什麼在給出否定n時,「%+ d」中的加號不會顯示出來?我的意思是它非常有用,但我不明白它爲什麼這樣做。 – Kaiton 2014-09-06 23:12:10

+0

@Kaiton,**有人可以解釋一下,爲什麼在給出一個否定n時,「%+ d」中的加號不會顯示出來?** sprintf()是一種方法,因此它可以被編程爲執行任何操作想。這就是它編程工作的方式。還是說你無法理解計算機程序如何在一種情況下做一件事,在另一種情況下又能做另一件事?查看我答案的底部,瞭解sprintf()的簡單實現。 – 7stud 2014-09-07 05:20:50

2

幾件事情在這裏:你可以把「放」的整個IF/ELSIF塊之前,避免在每一行有看跌期權,就像這樣:

puts case 
    when (value_n_in_f > 0 && value_m_in_f != 1) then "I: f(x)=#{value_m_in_f}x+#{value_n_in_f}" 
    when (value_n_in_f == 0 && value_m_in_f != 1) then "I: f(x)=#{value_m_in_f}x" 
end 

其次,一個case語句會更可讀的,就像這樣:

def big_compare(value_n_in_f, value_m_in_f) 
    msg = case 
    when (value_n_in_f > 0 && value_m_in_f != 1) then "I: f(x)=#{value_m_in_f}x+#{value_n_in_f}" 
    when (value_n_in_f == 0 && value_m_in_f != 1) then "I: f(x)=#{value_m_in_f}x" 
    when (value_n_in_f < 0 && value_m_in_f != 1) then "I: f(x)=#{value_m_in_f}x#{value_n_in_f}" 
    when (value_n_in_f > 0 && value_m_in_f == 1) then "I: f(x)=x+#{value_n_in_f}" 
    when (value_n_in_f == 0 && value_m_in_f == 1) then "I: f(x)=x" 
    when (value_n_in_f < 0 && value_m_in_f == 1) then "I: f(x)=x#{value_n_in_f}" 
    end 
end 
puts big_compare(0, 0) 
+0

我明白了,這非常有用。謝謝。那麼,這意味着沒有辦法將case/if語句分配給變量,就像使用函數一樣?我不能只用函數來定義一個函數來運行這個case語句,然後在需要時調用它呢? – Kaiton 2014-09-04 21:47:13

4

這裏是寫你的case語句更緊湊的方式。回想一下a <=> b => -1 if a < b,a <=> b => 0 if a == ba <=> b => -1 if a > b

"I: f(x)=" + 
case [value_n_in_f <=> 0, value_m_in_f == 1] 
when [ 1,false] then "#{value_m_in_f}x+#{value_n_in_f}" 
when [ 0,false] then "#{value_m_in_f}x" 
when [-1,false] then "#{value_m_in_f}x#{value_n_in_f}" 
when [ 1,true] then "x+#{value_n_in_f}" 
when [ 0,true] then "x" 
when [-1,true] then "x#{value_n_in_f}" 
end 

如果您希望證明字符串是如何構建的,你可以做這樣的事情(與value_n_in_fvalue_m_in_f分別更名爲interceptslope):

"I: f(x)=" + 
case 
when slope.zero? 
    intercept.zero? ? "0" : "#{intercept}" 
else 
    case slope.to_f 
    when 1.0 then "" 
    when -1.0 then "-" 
    else "#{slope}" 
    end + "x" + 
    case intercept <=> 0 
    when 0 then "" 
    when -1 then "#{intercept}" 
    else "+#{intercept}"  
    end 
end 

注意,這允許slope < 0,這不是規範的一部分。我測試了這個爲interceptslope各種組合:

intercept slope string 
     -2.1 4  I: f(x)=4x-2.1 
     -2.1 -2.2 I: f(x)=-2.2x-2.1 
     -2.1 0  I: f(x)=-2.1 
     -2.1 0.0 I: f(x)=-2.1 
     -2.1 -1  I: f(x)=-x-2.1 
     -2.1 1.0 I: f(x)=x-2.1 
     0  4  I: f(x)=4x 
     0  -2.2 I: f(x)=-2.2x 
     0  0  I: f(x)=0 
     0  0.0 I: f(x)=0 
     0  -1  I: f(x)=-x 
     0  1.0 I: f(x)=x 
     0.0 4  I: f(x)=4x 
     0.0 -2.2 I: f(x)=-2.2x 
     0.0 0  I: f(x)=0 
     0.0 0.0 I: f(x)=0 
     0.0 -1  I: f(x)=-x 
     0.0 1.0 I: f(x)=x 
     3  4  I: f(x)=4x+3 
     3  -2.2 I: f(x)=-2.2x+3 
     3  0  I: f(x)=3 
     3  0.0 I: f(x)=3 
     3  -1  I: f(x)=-x+3 
     3  1.0 I: f(x)=x+3