面向 C#开发人员的 Scala 隐式转换
面向 C#开发人员的 Scala 隐式转换
原文:https://medium.com/hackernoon/implicit-conversions-in-scala-for-c-developers-92ea6c7902fa
在我认识的许多学习 Scala 的人中,隐含性已经成为一个困扰的话题。来自。NET 和 C# 很难将这两种语言之间的隐式术语联系起来。
C#隐式转换
正如MSDN页所说
implicit 关键字用于声明隐式用户定义类型转换运算符。如果保证转换不会导致数据丢失,则使用它来启用用户定义类型和另一种类型之间的隐式转换。
基本上,我们将一种数据类型转换成另一种数据类型,保留信息,并且不使用转换。例如,下一个示例显示了这些转换是如何进行的。
这个特性提高了代码的可读性,因为自定义转换是以自然的方式发生的,我们避免了强制转换,同时保持代码足够干净。
Scala 隐式转换
在 Scala 中,隐式转换与 C# 基本相同,只是有一些语法差异。
这里我们看到了两种语言是如何解决相同的转换问题的,但是关于 Scala 隐式还有一些我们可以利用的东西,这也是让一些来自 C#的开发人员感到困惑的地方。
类型扩展
在 C#中,我们能够扩展类型,而无需创建新的派生类型。我们可以使用语言的类型扩展或方法扩展构造来避免原始类型的重新编译过程及其修改。
让我们看看这是如何在 C#中实现的
在这里,我们扩展了类型 int 并添加了方法 plus ,这样我们就可以这样做:
就可扩展性和灵活性而言,这个特性非常有用。有些API真的很难使用,因为它们原本不打算供其他人使用,而能够扩展它们的类型让我们能够控制第三方程序集。
在 Scala 中,我们有同样的功能,但是正如前面提到的,一些来自 C#世界的人理解起来有问题。我们可以在 Scala 中使用相同的隐式来解决 C#中方法扩展解决的相同问题。
让我们假设我们想用与 C#相同的方式从 Scala 中扩展 Int 类型。事情是这样的。
让我们明确一下,加方法有显式声明的返回类型,因为它是公共 API 方法,所以如果 Scala 中的类型推理系统发生变化,应该声明返回类型以避免冲突。
在最后一个例子中,我们做了与 C#中相同的事情。我们基本上已经定义了扩展 Int 类型的方法,但是为了使用它,我们需要改变类型。为了实现这一目标,我们:
重要的是要注意,当返回扩展类时,我们省略了 new 关键字,因为扩展是一个 case 类。
现在,我们可以像在 C#中一样使用这个扩展。
Scala 隐式的这种用法可能会导致很多你以前没有见过的问题。大概改变类型的常见用法是每个人都能理解的,但是在 Scala 中捕捉这个用例需要更深的语言知识,当来自其他语言时,比如 C#。
Scala 中伴随对象的注释
这超出了我们的主题,但是我认为谈论它是一个好主意,因为它在 Scala 语言中很重要。这将让每个人更好地理解我的上一个例子,我们在创建一个 IntExtensions 实例时完全忽略了 new 关键字。
Scala 中有一个构造叫做伴随对象。它基本上定义了一种创建特定类型的新实例的便捷方式。
让我们再次定义扩展类,但这次不是作为 case 类。
除了 case 关键字之外,这个定义看起来和上一个非常接近。现在,为了创建这个类的新实例,我们需要做
每次都是。如果我们能做到
相反。有一种很容易实现的方法。让我们看看它是如何完成的。
这里我们声明了一个与扩展同名的对象,它有一个名为 apply 的函数,并返回实际的扩展实例。这两个扩展扩展和它的伙伴对象需要一起定义才能工作。现在我们可以这样做。
这个定义和以前一样,但是记住 IntExtensions 类不再是 case 类,所以我们需要 new 关键字来创建它的实例。正在发生的情况是,当请求一个实例时,来自扩展伴随对象的应用函数被调用。
这个特性让我们可以在 Scala 中编写非常简洁的代码,尤其是在系统中使用通用类型的时候,比如创建列表。
而不是做
尽管这看起来很愚蠢,但当代码变得复杂时,它确实很有帮助,Python 编程语言就是一个例子。
C#语言还没有这个特性,但是为了赶上市场,微软编程语言中加入了大量的新特性。
我希望这个关于隐式的解释可以帮助其他来自微软世界的人像我一样享受其他编程语言。
黑客中午是黑客如何开始他们的下午。我们是 @AMI 家庭的一员。我们现在接受投稿并乐意讨论广告&赞助机会。
要了解更多信息,请阅读我们的“关于”页面,在脸书上点赞/给我们发消息,或者简单地说, tweet/DM @HackerNoon。