ruby - 在 Ruby 中给 if 语句一个变量

标签 ruby if-statement

我有这个 if 语句:

  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=if ....... end 是行不通的。还有别的办法吗? 这是我希望它看起来像的示例:

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

有什么办法可以做这样的事情吗?请注意,我对此绝对是新手。

提前致谢, 开顿

最佳答案

can't I just def a function with its function to run this case statement and call it then when I need it it?

当然:

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 没有它应该的那样高效:第一行应该被删除并复制到每个 when 分支——第一行除外。

回应评论:

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.

关于ruby - 在 Ruby 中给 if 语句一个变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25675134/

相关文章:

ruby - 将文件夹从 server1 复制到 server2 从 localhost linux 运行脚本

ruby - Github-Pages 在本地运行 Jekyll 时出错

ruby-on-rails - 如何使用 RVM 并创建全局可用的 gem?

Ruby 垃圾收集和 Puma

java - 如何为多个 if-else 语句编写函数

Ruby 异常处理 : can't suppress NoMethodError

java - 在 if 语句中检查多个参数是否具有相同值的更短方法?

c# - if 语句中的赋值

r - 大数据集清洗: How to fill in missing data based on multiple categories and searching by row order

MySql 多个 where 条件 - 只匹配第一个正确的条件