c# - 允许命名元组的语言

标签 c# return-value tuples

我想知道是否有任何语言允许命名元组。即:具有多个不同类型和可配置名称的变量的对象。

例如:

public NamedTuple<double:Speed, int:Distance> CalculateStuff(int arg1, int arg2)

var result = CalculateStuffTuple(1,2);

Console.WriteLine("Speed is: " + result.Speed.ToString())
Console.WriteLine("Distance is: " + result.Distance.ToString())

我可以想象动态如何支持这样的功能。我通常使用的静态语言(如 c#)可以执行字典,但除非所有项目都属于同一类型,否则这不是类型安全的。或者您可以使用元组类型,但这意味着您有固定的成员名称(Var1、Var2 等)。

您也可以编写一个小的自定义类,但这是我想避免的情况。

我可以想象宏处理语言可以用静态语言为您编写类似的脚本,但我不知道这样的语言。

这是我对 this question about return types 的回答.

最佳答案

老问题,但我认为需要更好的解决方案。

您可以利用 Tuple 类型获取命名参数,但将其包装在自定义命名类型中,将 .Item1、.Item2 等包装在有意义的属性名称中。

我也讨厌这样一个事实,即元组具有使代码不可读的未命名参数,但不能忽略它节省的时间,您必须自己实现 IComparable、IStructuralEquatable 等,这样您就可以安全地将结构用作字典键,例如。

我认为这是一个非常令人愉快的妥协:

public class Velocity : Tuple<double, double, string>
{
    public Velocity(double Speed, double Direction, string Units) : base(Speed, Direction, Units) { }
    public double Speed { get { return this.Item1; } }
    public double Direction { get { return this.Item2; } }
    public string Units { get { return this.Item3; } }
}

现在代替这个垃圾:

Tuple<double, double, string> myVelocity = new Tuple<double, double, string>(10, 2.34, "cm/s");
System.Diagnostics.Debug.Print("Speed: " + myVelocity.Item1);
System.Diagnostics.Debug.Print("Direction: " + myVelocity.Item2);
System.Diagnostics.Debug.Print("Units: " + myVelocity.Item3);

你可以这样做:

Velocity myVelocity2 = new Velocity(10, 2.34, "cm/s");
System.Diagnostics.Debug.Print("Speed: " + myVelocity2.Speed);
System.Diagnostics.Debug.Print("Direction: " + myVelocity2.Direction);
System.Diagnostics.Debug.Print("Units: " + myVelocity2.Units);

而且您仍然受益于所有美妙的元组功能,这些功能让您可以将它用作字典等中的复杂键。

唯一的缺点是,如果您只计划在单个方法的范围内使用此元组,则必须在该方法的包含类的范围内声明一个类型。对于大多数应用程序,我认为这不是问题。

关于c# - 允许命名元组的语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1490413/

相关文章:

c# - 使用鼠标调整表单大小有效,代码不会低于 178x47

Java调用方法并捕获返回

python元组和枚举

c# - 按位交换操作

c# - 在 Select() 查询中使用的 Lambda 表达式

c# - 剪贴板.设置比较

javascript - 如何实现 getter 函数(使用回调)

c - "return ret < 0"是什么意思?

typescript - 在 typescript 中将字典/对象键作为元组获取

haskell - 使用以下函数查找元组中的第 n 个元素