在CoffeeScript中,当返回具有多个返回值的函数时,我喜欢使用分解分配。与返回数组相比,它使返回的内容更加清晰。
例如,从JavaScript中的函数返回数组:
function getSumAndDiff(firstNumber, secondNumber) {
var sum = firstNumber + secondNumber
var difference = firstNumber - secondNumber
return [sum, difference]
}
var values = getSumAndDiff(10, 5)
var sum = values[0]
var difference = values[1]
在CoffeeScript中,从函数返回对象:
getSumAndDiff = (firstNumber, secondNumber) ->
sum = firstNumber + secondNumber
difference = firstNumber - secondNumber
{sum, difference}
{sum, difference} = getSumAndDiff(10, 5)
但是,问题在于CoffeeScript方法将替换任何现有的称为sum
和的变量difference
。因此,如果我连续多次运行此功能,则它们将继续覆盖前一个功能。
当然,有几种方法可以解决此问题,例如,只需每次将返回的变量分配给其他名称,就像这样:
{sum, difference} = getSumAndDiff(10, 5)
sum1 = sum
difference1 = difference
{sum, difference} = getSumAndDiff(11, 6)
sum2 = sum
difference2 = difference
但是,有没有更清洁的方法呢?或者,也许是最好的解决方案,当我需要连续运行多次这样的函数时,简单地返回一个数组?还是闭包有意义,或者代码过多?我只是想知道是否可能缺少某些东西,因为我认为必须有一种更清洁的方式来做到这一点,尤其是使用CoffeeScript时?还是我一般的处理方法有缺陷,例如为了简化操作,我应该每个函数只返回一个返回值?
好吧,我明白了。当您写:
getSumAndDiff = (firstNumber, secondNumber) ->
sum = firstNumber + secondNumber
difference = firstNumber - secondNumber
{sum, difference}
该函数getSumAndDifference
返回一个关联数组(以及一个对象),该数组具有键名和变量值。这只是语法糖,相当于:
{ 'sum': sum, 'diff': diff }
该关联数组是返回的值,然后您可以使用对象分解来获取各个感兴趣的字段:
{sum, difference} = getSumAndDiff(10, 5)
再一次,这只是语法糖:
_obj = getSumAndDiff(10, 5)
sum = _obj['sum']
diff = _obj['diff']
1)混淆对象的分解
首先,正如您自己解释的那样,您可以使用“别名”对象销毁来取回值作为另一个名称:
{sum:x, diff: y} = getSumAndDiff(10, 5)
这将设置x
为与sum
返回对象的字段相同的值。并y
与字段具有相同的值diff
。
语法糖周围:
_obj = getSumAndDiff(10, 5)
x = _obj['sum']
y = _obj['diff']
作为旁注,请再次注意{sum,diff}
实际上写快捷方式{sum: sum, diff: diff}
2)阵列解构
另一个更简单的替代方法不是返回对象,而是返回一个数组(更正式地讲,是一个数字索引的array):
getSumAndDiff = (firstNumber, secondNumber) ->
sum = firstNumber + secondNumber
difference = firstNumber - secondNumber
[sum, difference] ## <-- array [ ... ] not object { ... }
使用该语法,sum
并且diff
作为index0
和1
resp的项返回。数组 从调用方来看,然后可以使用数组解构来提取这些值:
[sum, diff] = getSumAndDiff(10, 5)
由于数组是按数字索引的,因此您不必担心字段名称。因此,您也可以这样写:
[x, y] = getSumAndDiff(10, 5)
[sum2, diff2] = getSumAndDiff(10, 5)
...
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句