首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

为什么Scala在使用by-name参数重载的情况下的行为与使用by-value参数的情况不同?

Scala在使用by-name参数重载的情况下的行为与使用by-value参数的情况不同,这是因为它们在参数传递和求值的方式上存在差异。

首先,by-value参数是指在函数调用时,实际参数会在调用前被求值,并将其值传递给函数。这意味着无论函数内部是否使用该参数,实际参数都会被求值。因此,在使用by-value参数重载时,无论调用函数时传入的是什么值,都会先对实际参数进行求值,然后再传递给函数进行处理。

相比之下,by-name参数是指在函数调用时,实际参数并不会立即被求值,而是在函数内部使用时才会进行求值。这意味着实际参数只有在函数内部使用时才会被求值,如果函数内部没有使用该参数,那么实际参数就不会被求值。因此,在使用by-name参数重载时,如果调用函数时传入的是一个表达式,那么该表达式只有在函数内部使用时才会被求值。

这种行为差异主要是由于参数传递方式的不同导致的。by-value参数传递的是参数的值,而by-name参数传递的是参数的表达式。因此,在使用by-name参数重载时,函数的重载决策会根据参数的类型和表达式来进行,而不仅仅是根据参数的值。

总结起来,Scala在使用by-name参数重载的情况下的行为与使用by-value参数的情况不同,是因为by-name参数的求值方式与by-value参数不同,导致函数的重载决策也不同。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

PostgreSQL vacuum 使用 full 情况下为什么有时也能回收空间

full 操作时候,他会针对你要操作统计信息先进行数据写入,并且要对这个表进行快照,来发现这个表是否正在被事务占用,并且要记录当前使用事务ID信息,如果此时没有事务对这个表进行操作,...则他就开始针对表一些物理特性进行分析比如到底有多少行,行版本中live and dead 情况。...下面这段代码大致注释: 1 客户运行vacuum 命令时根据参数来判断输入参数并根据参数判断是 vacuum full or 其他,并且开启一个事务,用vacuum open relation...函数,获取相关表结构,并且针对命令来对相关表进行加锁工作,不同模式使用不同锁来应对,在此还需要判断当前操作用户是否对表有权限操作,并且判断表类型是否是用户表等不是临时表,如果这些都不符合则自动报错退...更多详细操作还请参看源代码,相关代码为pg14 代码网上展示代码可能有出入。

16710

Scala基础 - 传名参数和传值参数(by-nameby-value parameter)

介绍 传值参数函数调用之前表达式会被求值,例如Int,Long等数值参数类型;传名参数函数调用前表达式不会被求值,而是会被包裹成一个匿名函数作为函数参数传递下去,例如参数类型为无参函数参数就是传名参数...简单类型传递示例 2.1 传值参数(by-value parameter)示例 在下面的示例中,编译器检测到strToInt接受一个传值参数,所以先对传入参数表达式{println("eval parameter...传名参数(by-name parameter)示例 strToInt函数声明中添加一个=>,参数s类型就变成了无参函数,类型为:() => String,按照Scala针对无参函数简化规则,此处省略了...复杂类型传递示例 3.1 传值参数(by-value parameter)示例 invode函数参数f类型为柯里化函数String => Int => Long, 此处为按值传递。...(by-name parameter)示例 invode函数参数f类型为一个无参函数,该无参函数返回类型为柯里化函数String => Int => Long, 因为参数f类型是无参函数,所以此处是按名传递

1.9K80
  • 学习PythonExcel:使用xlwt没有Excel情况下编写电子表格

    标签:PythonExcel,xlwt 有时候,不需要调用Excel来处理电子表格数据。例如,使用xlwt。...首先,使用pip命令终端安装xlwt: pip install xlwt 下面是一个示例。...原始文本文件数据如下: 09700RESEARCH 09800PHYSICIANS PRIVATE OFFICES 09900NONPAID WORKERS MANAGEMENT FEES REFERENCE...图1 要创建这样输出,代码脚本执行以下操作: 1.分隔帐号和名称 2.分配一个99999帐号,并将未编号帐号单元格颜色设置为红色 3.将帐户名转换为正确大写名称 4.删除帐户名中任何多余空格...5.将账号和姓名写入电子表格中两列 6.根据最宽数据宽度设置每个电子表格列列宽格式 代码如下: import sys import re from xlwt import Workbook, easyxf

    1.7K20

    IDEA使用模板自动生成类注释和方法,解决方法注释接口中或普通类方法外使用模板注释不带参数情况

    ${TIME} * @modified By ${USER} in ${DATE} ${TIME} * @description AddDescriptionHere */ idea 模板使用...velocity.apache.org 方法注释 File->Settings->Editor->Live Templates 1.创建模板组 2.创建对应模板 3.修改快捷键(缩略词) 针对接口中或普通类方法外使用模板注释不带参数情况...假如触发快捷键为doc, ★类中输入 "/doc" 触发方法注释可以带参数, ★但是下方template text 开头要去掉"/" 为了符合注释习惯,可以将快捷键设为 * 或 **,...★类中输入 /*或者/**可以触发带参数方法注释 ★对应template text 开头要去掉 /或者/* 相当于将快捷键替换为template text中内容,很好理解 4.添加模板内容...-脚本之家 使用groovy脚本生成idea方法注释参数格式对齐 发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/179201.html原文链接:https://javaforall.cn

    1.4K10

    聊聊JavaScala继承和多态

    很多API调用过程中,绝大多数情况下都是继承一个父类或接口类。...对于Scala用户来说,绝大多数情况使用extends就足够了。 重写@Override注解 可以看到,子类可以用自己方式实现父类和接口类方法,比如前面提到move方法。...Scala中,方法前添加一个override可以起到重写提示作用。 重载 一个很容易和重写混淆概念是重载(Overload)。...重载是指,一个类里有多个同名方法,这些方法名字相同,参数不同,返回类型不同。 这段代码演示了名为test方法有多种不同具体实现,每种实现在参数和返回类型上都有区别。...一些框架源码和API上应用了大量重载,目的是提供给开发者不同调用接口。 小结 本文简单总结了Java/Scala继承基本原理和使用方法,包括数据建模、关键字使用,方法重载

    84310

    理解std::move和std::forward

    此类构造函数接受一个包含注释std::string做参数,并且将此参数值拷贝到一个数据成员上,你声明一个接收by-value参数构造函数。...std::forward情况和std::move类似,但是和std::move无条件地将它参数转化为rvalue不同,std::forward特定条件下才会执行转化。...; //call with rvalue logAndProcess实现中,参数param被传递给了函数process.process按照参数类型是lvalue或者rvalue都做了重载。...更重要是,std::move使用表明了对rvalue无条件转换,然而,当std::forward只对被绑定了rvaluereference进行转换。这是两个非常不同行为。...2.std::forward参数被绑定为rvalue情况下才会将它转化为rvalue。 3.std::move和std::forwardruntime时啥都不做。

    1.7K21

    13.10 Scala使用JSON.toJSONString报错:ambiguous reference to overloaded definition13.10 Scala使用JSON.t

    13.10 Scala使用JSON.toJSONString报错:ambiguous reference to overloaded definition 问题描述: [ERROR] /Users/...Java可变长参数方法重载 Java代码中,我们是不推荐带有变长参数方法重载。这样代码调用人类阅读起来会感到“模糊”。...针对可变参数方法重载机制,这是Scalajava在编译处理上区别的地方。 Scala分辨重载方法过程Java极为相似。任何情况下,被选中重载版本都是最符合参数静态类型那个。...有时如果不止一个最符合版本;这种情况下编译器会给你一个“ambiguous reference to overloaded definition”(模糊引用了重载定义方法)错误。...解决方案: scala代码中显式调用:toJSONString(Object object, SerializerFeature... features) 。 另外,不推荐带有变长参数方法重载

    83330

    Scala学习笔记(一)

    这我们思考一下为什么会出现这种样式方法调用,应该说这是用于引入了“操作符做方法名”而产生一种自然需要!实际上,scala中允许使用操作符做方法名基本上C++中操作符重载是一样! ?...很显然,当我们引入了操作符重载之后,如果再使用“对象.方法名(参数)”方式调用方法会看上去非常古怪,也就是这里d.+(2.721),此时就是使用infix operator notation样式合适场所...对于给数组赋值语句:array(0) = “This”,这里要说明是:不同于java中array[0] = “This” scala中,[]永远是用来制定参数类型!...迭代Array操作是非常简单,我们只需要使用foreach方法,同时传递一个函数字面量即可。下面典型例子是迭代main函数args参数列表: ? 五、FOR循环 ? ?...关于构造函数重载 scala中,构造函数重载和普通函数重载是基本一样,区别只是构造函数使用this关键字指代!当然,也不能指定返回值。

    61610

    Scala使用JSON.toJSONString报错:ambiguous reference to overloaded definition问题描述:原因分析:解决方案:

    Java可变长参数方法重载 Java代码中,我们是不推荐带有变长参数方法重载。这样代码调用人类阅读起来会感到“模糊”。...项目和系统开发中,为了提高方法灵活度和可复用性,我们经常要传递不确定数量参数到方法中,Java 5之前常用设计技巧就是把形参定义成Collection类型或其子类类型,或者是数组类型,这种方法缺点就是需要对空参数进行判断和筛选...针对可变参数方法重载机制,这是Scalajava在编译处理上区别的地方。 Scala分辨重载方法过程Java极为相似。任何情况下,被选中重载版本都是最符合参数静态类型那个。...有时如果不止一个最符合版本;这种情况下编译器会给你一个“ambiguous reference to overloaded definition”(模糊引用了重载定义方法)错误。...解决方案: scala代码中显式调用:toJSONString(Object object, SerializerFeature... features) 。 另外,不推荐带有变长参数方法重载

    1.7K50

    Scala专题系列(一):Scala基础

    var price:double = 100.0 关于上述提到,val和var声明变量时必须初始化这一个规则,也有例外情况,比如这两个关键字均可以用在构造函数参数中,这时候变量是该类一个属性,因此显然不必声明时进行初始化...,将引起对象产生不可预见行为,这种bug往往是比较难查找 2:分号 Java和C++中,每个语句都以分号结束,而在Scala中,JavaScript和其他脚本语言类似,行尾位置不需要分号。..., String] 放在等号后边,代码会更简洁: val intToStringMap2 = new HashMap[Integer, String] 但是在有些情况下,我们必须显式类型注解,比如 :...方法返回值类型,以下情况中必须显式声明其类型。 – 方法中明显地使用了 return(即使方法末尾也是如此)。 – 递归方法。...– 两个或多个方法重载(拥有相同函数名),其中一个方法调用了另一个重载方 法,调用者需要显式类型注解。 – Scala 推断出类型比你期望类型更为宽泛,如 Any。

    72140

    案例说明flinkudf

    这种情况下,返回值类型TypeInformation,需要手动指定,方法是重载ScalarFunction#getResultType()。...>[]) { return Types.TIMESTAMP; } } Table Functions 表函数 标量函数相似之处是输入可以0,1,或者多个参数,但是不同之处可以输出任意数目的行数...leftOuterJoin操作算子会使用表函数(操作算子右边表)产生所有行进行(cross) join 外部表(操作算子左边表)每一行,并且表函数返回一个空表情况下会保留所有的outer rows...意味着你不能使用as修改表函数返回pojo字段名字。 默认情况下TableFunction返回值类型是由flink类型抽取工具决定。...这种情况下,返回值类型TypeInformation,需要手动指定,方法是重载TableFunction#getResultType()。

    7.4K20

    Scala | 教程 | 学习手册 --- 首类函数

    首类函数与其他数据类型一样,可以采用字面量创建;或者存储值、变量、或数据结构等容器中;还可以作为一个函数参数或返回值。...这个myDouble是一个函数值了,可以调用刚刚函数。 定义value格式是一样:val myDouble: 参数类型 = double。这里参数类型就是函数类型。...可以以下情况使用: 函数显式类型字面量之外指定 参数最多只用1次 scala> val doubler: Int => Int = _ * 2 doubler: Int => Int = combination(23, 12, _ * _) res13: Int = 276 使用两个类型参数(表示两个类型(可以不同也可以相同),但是可以代表任何具体类型int,double,boolean...Boolean = true 传名参数 by-name parameter 这个参数可以传进去一个值也可以传进去一个参数

    38720

    scala(五) 函数式编程

    面向对象编程 解决问题,分解对象,行为,属性,然后通过对象关系以及行为调用来解决问题。...Unit 或 无需定义 函数体:用于编写业务逻辑语句块 java方法区别: scala 可以将函数定义到任意位置,甚至一个函数内定义一个函数。...中函数可以不用加 return 用来标识返回值,scala中会以最后一个参数或表达式结果作为返回值。...一个方法中只能有一个可变参数。 可变参数不能与带名参数一起使用(后面会讲) 带参默认值 程序开发中,往往有这样需求,当某些值为null或0时,我们需要判断,然后给它指定一个默认值。...带名参数 以上面的案例说明;第一个参数为姓名,第二个参数为年龄,第三个参数为性别,一般情况下函数调用参数,就按照函数定义时参数顺序一个个传递。

    37420

    解决 Usersjackbooklightswordsrcmainscalacomspringbootinactionfi

    这种错误通常意味着某个方法调用中存在重载定义引用模糊问题。下面是一些解决该错误常见方法。1. 检查方法参数类型错误信息中提到了出错源文件和行数,我们可以找到相关代码进行检查。...这个错误通常是由于方法参数类型模糊引起。请确保调用方法参数上没有重载,或者提供明确参数类型来消除模糊引用。2....避免方法重载另一种解决该错误方法是避免方法重载定义。重载定义调用时容易引起模糊引用问题,尤其是参数类型相似的情况下。如果可能的话,尽量避免方法重载定义,这样可以消除模糊引用错误。4....通过检查方法参数类型、使用类型转换、避免方法重载定义、更新相关库和依赖项,以及寻求帮助,我们可以解决这种编译错误。希望这篇文章对你解决类似问题有所帮助!...它可以用于编写更具有可读性和可维护性代码,尤其是方法有多个参数,而这些参数名称不够描述性或易于理解情况下

    17320

    Java 已老,Kotlin 或将取而代之?

    Kotlin提供了最好支持,从而在编译时避免空引用。默认情况下,所有对象都不能为空,如果想定义可空类型,就必须使用 ? 操作符。访问可空对象时,编译器会强行要求使用安全调用操作符 ?.。...还可以对data类使用对象解构,将对象属性保存到变量中。 可以避免Builder类和冗余方法重载 Kotlin支持方法命名参数,因此大多数情况下无需再创建Builder类。...此外,Kotlin还支持默认方法参数,因此无需再为传递默认值而重载方法。...Scala不同,Kotlin没有自己集合库,它只是扩展了JDK集合。因此Java和Kotlin集合类型之间转换无需使用胶水代码。...这是个很强大功能,利用它可以轻松扩展语言核心API。 ▌为什么应该使用Kotlin?

    1.7K30

    Scala 模式匹配

    以往传统静态语言中,要在程序中植入 “变化点”,要么就是 if-else 语句(本质上 switch-case 和使用 Map 去寻找匹配 value 也属于 if-else),要么就是多态,要么就是方法重载...虽然说,这个例子可以说和使用 if-else 相比,似乎没有太大区别,但是存在不同参数组合情况时候,这个写法优势就体现出来了: translate :: String -> String translate...再挪到 Scala 里面看模式匹配,上面的情况也都能够支持。...,因此如果增加了某一个新实现类,那么我需要把这个新实现类中需要重载/实现接口(或抽象类)所有方法全部实现一遍,而这些增加方法都是集中在这个新增类/对象里。...”,这个看起来有点像抽自己脸行为(最初对 “接口” 这个概念定义,是要求它 “纯粹”,没有任何方法实现),正是由于上面说这个原因造成——接口不具备开放修改能力,如今要在接口中增加一个默认行为

    97430

    Spark2.x学习笔记:2、Scala简单例子

    Scala 中声明变量和常量不一定要指明数据类型,没有指明数据类型情况下,其数据类型是通过变量或常量初始值推断出来。...所以,如果在没有指明数据类型情况下声明变量或常量必须要给出其初始值,否则将会报错。...2.9 元祖 列表一样,元组也是不可变,但列表不同,元组可以包含不同类型元素。而列表应该是List[Int]或List[String]样子,元组可以同时拥有Int和String。...默认情况下Scala使用不可变映射(Map)。如果要使用可变集合(Set),则必须明确导入scala.collection.mutable.Map类。...(6)apply方法 前面我们通过语句var a1 = Array("QQ", "Baidu", "Google")直接创建了数组,为什么使用new呢,为什么使用Array构造器呢?

    3.1K80

    一文读懂《Effective Java》第41条:慎用重载

    所以,覆盖机制满足人们对于方法调用方法行为期望。如果编写出来代码行为可能使得程序员困惑,那就是糟糕实现。 应该避免胡乱使用重载机制,安全而保守策略是,永远不导出两个具有相同参数数目的重载方法。...如果方法是“可变参数(varargs)”,保守策略是你根本不要重载它。 对于构造器,我们没有选择使用不同名称机会,一个类多个构造器总是重载。...一般情况下,多个具有相同参数数目的方法来说,应该尽量避免重载方法。 至少避免这种情形:同一组参数只需经过类型转换就可以被传递给不同重载方法。...如果不能避免这种情形,例如为正在改造一个现有的类以实现新接口,就应该保证:当传递同样参数时,所有重载方法行为必须一致。...如果不能做到这一点,程序员就难有效使用重载方法或者构造器,因为不能理解它为什么不能正常工作。

    22110
    领券