2014-09-04 65 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