数据“显式”传递给函数,而方法“隐式传递”给调用它的对象。
请您解释一下这两种传递数据的方式之间的区别吗?java 或 c# 中的示例会有所帮助。
这是交易:
当我有一个带有像这样的默认参数的函数时
int foo (int a, int*b, bool c = true);
Run Code Online (Sandbox Code Playgroud)
如果我错误地这样称呼它:
foo (1, false);
Run Code Online (Sandbox Code Playgroud)
编译器会将 false 转换为 int 指针并调用 b 指向 0 的函数。
我见过人们建议使用模板方法来防止隐式类型转换:
template <class T>
int foo<int> (int a, T* b, bool c = true);
Run Code Online (Sandbox Code Playgroud)
但这种方法太混乱并且使代码变得混乱。
有显式关键字,但它仅适用于构造函数。
我想要的是一种与显式方法类似的干净方法,这样当我声明该方法时,如下所示:
(keyword that locks in the types of parameters) int foo (int a, int*b, bool c = true);
Run Code Online (Sandbox Code Playgroud)
并这样称呼它:
foo (1, false);
Run Code Online (Sandbox Code Playgroud)
编译器会给我这个:
foo (1, false);
^
ERROR: Wrong type in function call (expected int* but got bool)
Run Code Online (Sandbox Code Playgroud)
有这样的方法吗?
我一直在用 sympy 做导数,我不知道在语法上会如何写。我尝试查找它,但没有一个解决方案有意义。例如,如果我试图x**5 + y**2 + z**4 = 8xyz通过计算来区分,我该怎么做?z 是一个符号,还是一个像正则导数那样的函数?谢谢你。
class Foo[T](t: T)(implicit int: Numeric[T]) {
val negated = -t
val doubled = t + t
val squared = t * t
// ...
}
Run Code Online (Sandbox Code Playgroud)
我在这里的所有三行上都有红色波浪线。是什么赋予了?
我有一个隐含的方法:
def f(x: String)(implicit dispatcher: ExecutionContextExecutor, mat: ActorMaterializer) = ???
Run Code Online (Sandbox Code Playgroud)
我想创建一个辅助方法,如:
def g1(y: String) = f("uri1" + y)
def g2(y: String) = f("uri2" + y)
Run Code Online (Sandbox Code Playgroud)
当然,no implicits found for parameter ex: ExecutionContext对于方法,这不能编译g。
我不想implicits在g.
那么,这个案例的惯用解决方案是什么?
如果我可以创建具有类似想法的方法,我很感兴趣:
def myMethod[T](param: T)(implicit oneOf: Either[TypeClass1[T], TypeClass2[T]]) = oneOf match ...
Run Code Online (Sandbox Code Playgroud)
我尝试使用默认参数(我在 akka 中看到过类似的东西):
def myMethod[T](param: T)(implicit t1: TypeClass1[T] = null, t2: TypeClass2[T] = null) =
if (t1 == null) ...
Run Code Online (Sandbox Code Playgroud)
但是,这样我就不能强制 Scala 编译器至少找到其中之一。
此外,我已经实现了从TypeClass1[T]toLeft[TypeClass1[T], TypeClass2[T]]和 from TC2to 的隐式转换Right,但是 Scala 编译器忽略了这种转换。
有没有办法做这样的事情?
在 Cats 2.1.x 中,类型类实例被引入范围内import cats.implicits._
scala> import cats.Show
import cats.Show
scala> Show[Int].show(42)
<console>:13: error: could not find implicit value for parameter instance: cats.Show[Int]
Show[Int].show(42)
^
scala> import cats.implicits._
import cats.implicits._
scala> Show[Int].show(42)
res1: String = 42
Run Code Online (Sandbox Code Playgroud)
然而在 Cats 2.2.0中,它无需import cats.implicits._例如
scala> import cats.Show
import cats.Show
scala> Show[Int].show(42)
val res0: String = 42
Run Code Online (Sandbox Code Playgroud)
发生了什么变化以及从现在开始我们应该如何使用导入?
当询问有关隐式的问题时,与答案(或有时这就是答案本身)一起给出的常见建议/推荐/建议是implicit vals与显式类型签名一起使用,而不是使用implicit objects。
但是,这背后的原因是什么?
检查 fs2 教程,我偶然发现了以下代码
def client[F[_]: MonadCancelThrow: Console: Network]: F[Unit] =
Network[F].client(SocketAddress(host"localhost", port"5555")).use { socket =>
socket.write(Chunk.array("Hello, world!".getBytes)) >>
socket.read(8192).flatMap { response =>
Console[F].println(s"Response: $response")
}
}
Run Code Online (Sandbox Code Playgroud)
在哪里
Network[F].client
Run Code Online (Sandbox Code Playgroud)
感觉很奇怪,因为我通常不会写
implictly[Network[F]].client
Run Code Online (Sandbox Code Playgroud)
所以我检查了代码并且它可以工作和编译,所以它一定是隐式不再需要了。我想知道从什么时候开始?它会被弃用吗?有人可以分享 scala 发行说明的链接或说明这一点的东西吗?
我需要检查类型之间是否存在隐式转换.对于内置类型,我可以创建一个字典,其中包含相应可用类型的类型和列表.但是对于自定义类型,这是不可能的,因为我不知道将检查哪些代码.有没有通用的方法来做到这一点?
谢谢.