Ruby 在IF语句中包含来自其他条件的代码而不重复

Ruby 在IF语句中包含来自其他条件的代码而不重复,ruby,Ruby,我需要执行以下代码 if var == 1 #some code #1 elsif var == 2 #some code #1 + some code #2 elsif var == 3 #some code #1 + some code #2 + some code #3 elsif var == 4 #some code #1 + some code #2 + some code #3 + some code #4 end 我怎样才能在不重复代码的情况下重写它 改用swi

我需要执行以下代码

if var == 1
  #some code #1
elsif var == 2
  #some code #1 + some code #2
elsif var == 3
  #some code #1 + some code #2 + some code #3
elsif var == 4
  #some code #1 + some code #2 + some code #3 + some code #4
end

我怎样才能在不重复代码的情况下重写它

改用switch语句:

case var
when 1
  puts "It's 1"
when 2
  puts "It's 2"
when 3
  puts "It's 3"
when 4
  puts "It's 4"
else
  puts "None of the above"
end
如果您确实想使用If语句,可以使用速记:

puts 'It's 1' if var == 1
puts 'It's 2' if var == 2

请改用switch语句:

case var
when 1
  puts "It's 1"
when 2
  puts "It's 2"
when 3
  puts "It's 3"
when 4
  puts "It's 4"
else
  puts "None of the above"
end
如果您确实想使用If语句,可以使用速记:

puts 'It's 1' if var == 1
puts 'It's 2' if var == 2

创建不同的方法并调用它们

def method1
  return "Do "
end

def method2
  return "you "
end

def method3
  return "believe "
end

def method4
  return "in magic"
end

print "Type in a number between 1-4\nNumber: "
number = gets.chomp.to_i

case number
  when 1
    puts method1
  when 2
    puts method1 + method2
  when 3
    puts method1 + method2 + method3
  when 4
    puts method1 + method2 + method3 + method4
  else
    puts "Something something..."
end

创建不同的方法并调用它们

def method1
  return "Do "
end

def method2
  return "you "
end

def method3
  return "believe "
end

def method4
  return "in magic"
end

print "Type in a number between 1-4\nNumber: "
number = gets.chomp.to_i

case number
  when 1
    puts method1
  when 2
    puts method1 + method2
  when 3
    puts method1 + method2 + method3
  when 4
    puts method1 + method2 + method3 + method4
  else
    puts "Something something..."
end

我假设您想要执行副作用,一个选项是将代码移动到块并随意执行。我假设这些调用都是同质的:

proc1 = proc { ... }
proc2 = proc { ... }
proc3 = proc { ... }

case var
when 1
  proc1.call
when 2
  proc1.call
  proc2.call
when 3
  proc1.call
  proc2.call
  proc3.call
end
这相当于:

[proc1, proc2, proc3, ....].take(var).each(&:call)

我假设您想要执行副作用,一个选项是将代码移动到块并随意执行。我假设这些调用都是同质的:

proc1 = proc { ... }
proc2 = proc { ... }
proc3 = proc { ... }

case var
when 1
  proc1.call
when 2
  proc1.call
  proc2.call
when 3
  proc1.call
  proc2.call
  proc3.call
end
这相当于:

[proc1, proc2, proc3, ....].take(var).each(&:call)
不需要在一个大的if或case块中运行整个过程,除非您遇到特殊情况,例如只想运行代码3和代码5(在这种情况下,我会按照tokland的建议构建proc数组)


不需要在一个大的if或case块中运行整个过程,除非您遇到特殊情况,例如只想运行代码3和代码5(在这种情况下,我会按照tokland的建议构建proc数组)

“一些代码N”是表达式,它们有副作用吗?可以使用什么值?它总是整数吗?它能大于
5
,等等吗?对不起,我忘了告诉你:var-总是字符串类型。“一些code\N”是表达式,它们有副作用吗?
var
可以取什么值?它总是整数吗?它能大于
5
,等等吗?对不起,我忘了告诉你:var-总是字符串类型。这复制了if分支,但没有回答问题。这复制了if分支,但没有回答问题。+1,有副作用,这可能是最简单的。如果代码的输出是表达式,那就不同了。很抱歉,我忘了告诉你:var-总是字符串类型。如果字符串是任意的,并且条件在顶部会变得复杂,那么你最好还是使用tokland的解决方案。但是,如果这只是一个级联,其中每个方法都与一个字符串值和它后面的所有字符串值相关联,那么您可以使用一个字符串数组和匹配的方法名称数组,以及.member?方法来确定是否应该调用下一个方法。+1,有副作用这可能是最简单的方法。如果代码的输出是表达式,那就不同了。很抱歉,我忘了告诉你:var-总是字符串类型。如果字符串是任意的,并且条件在顶部会变得复杂,那么你最好还是使用tokland的解决方案。但是,如果这只是一个级联,其中每个方法都与一个字符串值和它后面的所有字符串值相关联,那么您可以使用一个字符串数组和匹配的方法名称数组,以及.member?方法来确定是否应该调用下一个方法。真的很喜欢它有多优雅真的很喜欢它有多优雅