gpt4 book ai didi

ruby - Ruby Koans 的 triangle.rb 更优雅的解决方案

转载 作者:数据小太阳 更新时间:2023-10-29 06:35:56 24 4
gpt4 key购买 nike

我一直在研究 Ruby Koans 并完成了 about_triangle_project.rb,您需要在其中编写方法 triangle 的代码。

可在此处找到这些项目的代码:

https://github.com/edgecase/ruby_koans/blob/master/koans/about_triangle_project.rb

https://github.com/edgecase/ruby_koans/blob/master/koans/triangle.rb

在 triangle.rb 中,我创建了以下方法:

def triangle(a, b, c)
if ((a == b) && (a == c) && (b == c))
return :equilateral
elsif ((a == b) || (a == c) || (b == c))
return :isosceles
else
return :scalene
end
end

我通过阅读 Chris Pine 的“学习编程”了解到做事情的方法总是不止一种。尽管上面的代码有效,但我还是忍不住认为有一种更优雅的方法可以做到这一点。是否有人愿意就如何使这种方法更高效、更紧凑提出他们的想法?

我很好奇的另一件事是,为什么在确定等边三角形时,我无法创建 (a == b == c) 的条件。它是等边三角形的证明,但 Ruby 讨厌这种语法。是否有关于这是为什么的简单解释?

最佳答案

原因很简单:

== 在 Ruby 中是一个运算符,它执行特定的功能。运算符有确定它们应用顺序的规则——因此,例如,a + 2 == 3 在相等性检查之前评估加法。但是一次只评估一个运算符(operator)。将两个相等性检查并排放置是没有意义的,因为相等性检查的计算结果为 truefalse。一些语言允许这样做,但它仍然不能正常工作,因为如果 ab 那么你将评估 true == c是相等的,这显然不是真的,即使 a == b == c 在数学上也是如此。

至于更优雅的解决方案:

case [a,b,c].uniq.size
when 1 then :equilateral
when 2 then :isosceles
else :scalene
end

或者,更简短(但可读性较差):

[:equilateral, :isosceles, :scalene].fetch([a,b,c].uniq.size - 1)

关于ruby - Ruby Koans 的 triangle.rb 更优雅的解决方案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4742692/

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