gpt4 book ai didi

ruby - 组合多个 'elsif' 语句

转载 作者:太空宇宙 更新时间:2023-11-03 18:06:25 25 4
gpt4 key购买 nike

我尝试用 Ruby 编写 snakes 程序。为了让自己更加熟悉Ruby。我通过将蛇的 X 和 Y 值保存在两个一维数组中来定义蛇的每个部分的位置,一个用于 X 值,一个用于 Y 值。

 $x = [2,...]
$y = [2,...]

(我忘了说的是,蛇的头随着用户输入而移动,而其余部分只是继承了之前部分的位置,就像这样。)

def length(f)
if $length >= f
$y[f] = $y[f-1]
$x[f] = $x[f-1]
end
end

为了让 Snake 能够四处移动,我编写了这个。

for a in (1..20)  
for b in (1..20)
print " X "
end
puts" "
end

这给了我一个 20*20 的字段。

然后我试着像这样在 field 上显示蛇的每一部分。(同时也在 field 周围画一个边框。)

for a in (1..20)
for b in (1..20)
if a == 1 || a == 20
if b == 1 || b == 20
print " + "
else
print " - "
end
elsif b == 1 || b == 20
print " | "
elsif a == $x[0] && b == $y[0]
body
elsif a == $x[1] && b == $y[1]
body
elsif a == $x[2] && b == $y[2]
body
elsif a == $x[3] && b == $y[3]
body
elsif a == $x[4] && b == $y[4]
body
else
print " "
end

end
puts""
end

这行得通,但如果用户真的很好/有很多空闲时间,我需要分配 elsif,因为如果蛇应该有一个限制,每个代表蛇的一部分长度为 100 我需要制作 100 个 elsif 语句。(正文只是:

def body
print " # ".green
end

)
我尝试用这样的 for 循环 修复它:

for c in (1..100)
if a == $x[c] && b == $y[c]
body
end
end

还有这个

 loop do  
$x.size.times do |index|
if $x[index] == a && $y[index] == b
body
end
end
break
end

但遗憾的是,这并没有给出预期的结果,因为它干扰了吸引该领域边界的 if

有没有办法组合这些多个 elsif 语句?

我们将不胜感激任何帮助。 (抱歉在初稿中含糊不清。)

最佳答案

推荐的重构

注意:您的原始帖子中没有包含样本数据,因此您的答案会有所不同。

您有很多问题,而不仅仅是一个。除了不是 DRY,您的代码也不是很可测试,因为它没有分解成离散的操作。您可以(并且可能应该)做很多事情:

  1. 将您的“主体”内容分解为离散的方法。
  2. 使用 Array 或 Enumerator 方法来简化数据。
  3. 使用动态方法循环您的数组,而不是固定范围或 for 循环。
  4. 在循环中使用 case/when 语句来处理同一变量的多个条件。

简而言之,您需要重构您的代码以使其更加模块化,并利用该语言迭代您的数据对象,而不是像您当前所做的那样对每个元素使用一个条件。

简化您的数据集并按程序处理

例如,请考虑以下内容:

def handle_matched_values array
end

def handle_mismatched_values array
end

paired_array = a.zip b

matched_pairs = paired_array.select { |subarray| subarray[0] == subarray[1] }
unmatched_pairs = paired_array.reject { |subarray| subarray[0] == subarray[1] }

matched_pairs.each { |pair| handle_matched_values pair }
matched_pairs.each { |pair| handle_mismatched_values pair }

在此示例中,您甚至可能不需要 if 语句。相反,您可以使用 Array#selectArray#reject查找与您想要的任何条件匹配的索引,然后为结果调用相关的处理程序。这具有非常程序化的优势,并且非常清楚正在配对的数据集和处理程序。它的可读性也很强,这一点非常重要。

动态循环和案例语句

如果您确实需要在单个循环中处理您的数据,请使用 case 语句来清理您的条件。例如:

# Extract methods to handle each case.
def do_something_with data; end
def do_something_else_with data; end
def handle_borders data; end

# Construct your data any way you want.
paired_array = a.zip b

# Loop over your data to evaluate each pair of values.
paired_array.each do |pair|
case pair
when a == b
do_something_with pair
when a == paired_array.first || paired_array.last
handle_borders pair
else
do_something_else_with pair
end
end

当然还有很多其他方法可以成对处理大型数据集。目标是为您提供重构代码的基本结构。剩下的就看你了!

关于ruby - 组合多个 'elsif' 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44344945/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com