gpt4 book ai didi

ruby - 避免在 Ruby 中改变方法参数的好习惯?

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

我知道在 Ruby 中避免改变方法参数是一种很好的做法(除非有特别的意图)。

关于我应该如何管理它的简单编码经验法则(在样式、命名约定等方面)是什么?

例如,这是好的做法吗?

def array_of_three(a, b, c)
d = a.dup
e = b.dup
f = c.dup
# Do work on d, e and f
return [d, e, f]
end

我应该如何命名方法参数与函数中可以改变的重复项? (假设类似上述方法是“正确的”!)

谢谢。

最佳答案

Ruby 的“良好实践”通常归结为不改变您不拥有的数据。问题是所有权可能有些模糊,所以如果有疑问,您会想假设您拥有数据并复制一份如果您需要改变

不良行为的表现方式是这样的一个例子:

a = [ 1, 2, 3 ]

do_stuff(a) # Works
do_stuff(a) # Doesn't do anything for some reason

a
# => [ ] # Hey! Who did that?

假设 do_stuff 是个 SCSS ,他做了这个:

def do_stuff(a)
while (v = a.pop)
puts a
end
end

这会破坏您给出的论据,这很糟糕。相反,您应该采用非破坏性方法:

def do_stuff(a)
a.each do |v|
puts v
end
end

如果需要操作该结构,则改为制作副本,例如:

def do_stuff(a)
a = a.uniq.sort
while (v = a.pop)
puts v
end
end

测试您的方法是否正常运行的一个好方法是在测试中向它们提供卡住数据:

a = [ 1, 2, 3 ].freeze

do_stuff(a) # Fails trying to manipulate frozen object

我倾向于使用极度卡住的数据(例如 deep_freeze)编写单元测试,以确保参数不能被修改。这很快就解决了所有权问题。

如果您的函数具有这样的方法签名:

def do_stuff(*a, **b)
# ...
end

那么您将同时拥有 a (varargs) 和 b (kwargs),因为它们是专门为您的方法分解的。在所有其他情况下,您需要小心。这就是按契约(Contract)编程 很重要的地方,因为您的方法的调用者必须知道哪些参数被移交,哪些没有移交。文档必须明确这一点。

关于ruby - 避免在 Ruby 中改变方法参数的好习惯?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51090377/

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