Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >为什么人们在Scala中的另一个对象中定义类、特性、对象?

为什么人们在Scala中的另一个对象中定义类、特性、对象?
EN

Stack Overflow用户
提问于 2011-01-13 06:47:15
回答 4查看 9.1K关注 0票数 26

好吧,我会解释我为什么问这个问题。这些天我开始阅读Live2.2源代码。如果您以前碰巧读过lift源代码,这是很好的。

在Lift中,我发现,定义内部类和内在特性是非常常用的。

对象菜单具有2个内部特征和4个内部类。对象Loc有18个内部类,5个内部特征,7个内部对象。

有很多代码都是这样写的。我想知道作者为什么这样写。

  • 是因为作者的个人品味,还是语言功能的强大运用?
  • 这种用法有什么取舍吗?
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-01-13 08:09:49

在2.8之前,您必须在包和对象之间进行选择。包的问题是它们不能单独包含方法或值。所以你必须把所有的东西都放进另一个物体里,这会很尴尬。观察:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
object Encrypt {
  private val magicConstant = 0x12345678
  def encryptInt(i: Int) = i ^ magicConstant
  class EncryptIterator(ii: Iterator[Int]) extends Iterator[Int] {
    def hasNext = ii.hasNext
    def next = encryptInt(ii.next)
  }
}

现在您可以import Encrypt._并访问方法encryptInt以及类EncryptIterator。手巧!

相比之下,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package encrypt {
  object Encrypt {
    private[encrypt] val magicConstant = 0x12345678
    def encryptInt(i: Int) = i ^ magicConstant
  }
  class EncryptIterator(ii: Iterator[Int]) extends Iterator[Int] {
    def hasNext = ii.hasNext
    def next = Encrypt.encryptInt(ii.next)
  }
}

这并没有太大的不同,但它使用户同时导入了encrypt._encrypt.Encrypt._,或者不得不一遍又一遍地编写Encrypt.encryptInt。为什么不像第一种模式那样只使用对象呢?(实际上不存在性能损失,因为嵌套类实际上并不是幕后的Java内部类;据JVM所知,它们只是常规类,但是有一些花哨的名称,告诉您它们是嵌套的。)

在2.8中,你也可以吃蛋糕:把这个东西叫做包对象,编译器会为你重写代码,这样它实际上看起来就像引擎盖下的第二个例子(除了Encrypt实际上在内部被称为package ),但是在名称空间方面,它的行为就像第一个例子--就命名空间而言--这些值和防御程序就在那里,而不需要额外的导入。

因此,在2.8之前启动的项目通常使用对象来封装大量的东西,就像它们是一个包一样。在2.8之后,主要动机之一已被删除。(但要明确的是,使用对象仍然没有坏处;更重要的是它在概念上具有误导性,而不是它对性能或诸如此类的负面影响。)

(请注意,请不要试图用这种方式加密任何东西,除非是作为一个例子或一个笑话!)

票数 21
EN

Stack Overflow用户

发布于 2011-01-13 07:48:12

当您想要使用抽象类型变量时,有时需要在对象中放置类、特征和对象,请参见类型

票数 4
EN

Stack Overflow用户

发布于 2011-01-13 06:50:47

两者都可以。除其他外,内部类/特性的实例可以访问其父类的变量。内部类必须使用父实例创建,父实例是外部类型的实例。

在其他情况下,它可能只是将密切相关的事情分组的一种方式,如您的object示例所示。注意,特征LocParam是密封的,这意味着所有子类都必须位于同一个编译单元/文件中。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4681323

复制
相关文章
WordPress 如何获取分类/标签的ID
鼠标移动到编辑处,看到浏览器底部出现链接,其中的tag_ID=5中这个5就是分类的ID,标签同理。
可定
2020/04/20
5.8K0
WordPress 如何获取分类/标签的ID
WordPress通过分类ID获取分类名称与链接
在Wordpress主题开发的过程中,尤其是CMS主题分类的布局,通过后台选项选择分类,前台通过调用分类的ID来获取分类的名称和链接,这时我们将使用到get_cat_name()和get_category_link()两个函数,反过来也可以通过get_cat_ID()函数来获取分类ID。
.T.
2022/02/22
2.2K0
WordPress || WordPress 获取当前分类 ID 的几种方法
下面介绍的几种方法目的都是一样的,但是使用的环境和状况均不同,请大家仔细分辨以及寻找适合自己的方法来进行使用。
w候人兮猗
2020/07/01
2.4K0
tp6中无限极分类里面的获取多级分类数据
就是很多很多的数据,按照无限极分类结构排序。每一个数组的所有数据都是顶级分类及其其下数据
贵哥的编程之路
2022/06/05
9840
tp6中无限极分类里面的获取多级分类数据
MySQL获取每个分类下面的前三条数据
现在项目遇到个问题,我相册图片里面有很多分类,我想取出每个分类下面的前三条数据,应该怎么做呢? 数据结构如下:
用户7657330
2020/08/14
2.5K0
getIdentifier获取资源id
首先我想到的是反射,但是经过实验发现提示报错no emoty constructor。
提莫队长
2019/02/21
4K0
网站404页面的设计
每一个网站都必须有404页面,404页面指的是显示网站错误链接的页面,可能是该访问的页面不存在,也可能是页面已经被删除。
岳泽以
2022/10/26
1.4K0
网站404页面的设计
mybatis获取update的id
平常我门都是更新数据,用更新的条件再查询一次,得到更新的记录。这样我门就进行了两次数据库操作,链接了两次数据库。增加了接口的处理事件,因为链接数据库是很耗时的操作。
似水的流年
2018/01/25
9.3K0
mybatis获取update的id
平常我门都是更新数据,用更新的条件再查询一次,得到更新的记录。这样我门就进行了两次数据库操作,链接了两次数据库。增加了接口的处理事件,因为链接数据库是很耗时的操作。 其实可以通过 mybatis 的 selectKey 标签来解决这个问题。  selectKey 这个标签大家基本上都用过,比如在插入数据的时候,返回插入数据的纪录。如: <selectKey resultType="int" order="AFTER" keyProperty="id"> SELECT
似水的流年
2018/03/28
3.8K0
sqlite 获取最后插入id
SQLite数据库中的表均有一个特殊的rowid字段,它是一个不重复的64位有符号整数,默认起始值为1。rowid别名为oid或_rowid_,但在创建表的SQL声明语句中只能使用rowid作为关键字。如果在创建表的时候设置了类型为integer的具有自动增长性的主键,那么这时的主键相当于是rowid的别名。
随心助手
2020/06/09
6.2K0
mybatis获取update的id
平常我门都是更新数据,用更新的条件再查询一次,得到更新的记录。这样我门就进行了两次数据库操作,链接了两次数据库。增加了接口的处理事件,因为链接数据库是很耗时的操作。
似水的流年
2019/12/06
3.4K0
Typecho自定义首页/单页模板以及不同分类不同模板
虽然Typecho程序看起来和WordPress一样是个人博客程序,但是我们都知道后者的强大,有很多内容网站、企业网站,甚至B2C商城网站都有使用WordPress程序。但是我们也知道WordPress的弱点就是后续占用资源太大,功能插件是丰富,但是用多之后很占用资源。对于公司一些小的企业网站项目,后面准备用Typecho程序或者ZBLOG程序制作,比较轻便。
老蒋
2021/12/24
3.2K0
Typecho自定义首页/单页模板以及不同分类不同模板
pgsql 通过 序列 批量获取ID
CREATE OR REPLACE FUNCTION getNextIds (VARCHAR,INTEGER) RETURNS VARCHAR AS $body$ DECLARE str VARCHAR ; DECLARE nextid VARCHAR ; BEGIN str = ''; FOR i in 1..$2 loop nextid = (SELECT NEXTVAL($1)); str = str || nextid || ';' ; EN
qubianzhong
2018/08/08
3.9K0
Python 进程,获取进程id( o
import os pid=os.fork() #fork反复拷贝 if pid==0: print("A",os.getpid(),os.getppid()) else: print("B",os.getpid(),os.getppid()) # os.getpid()获取当前进程id os.getppid()获取父进程id
py3study
2020/01/10
4.5K0
职教云教师ID获取教程
首先呢,因为这个教师ID在多个地方都有出现,但是每个老师的活动情况都不一样,所以也就没有写到软件里了(好吧,我就是懒)。然后修改作业时间呀,作业分数呀都需要用到这个ID,所以这里写一下获取教程。
SingYi
2022/07/14
3.8K0
职教云教师ID获取教程
Android 动态获取资源的ID
但是对于以上做法, 官方并不推荐,并且 getIdentifier这个写library的时候, 如果里面需要引用主程的资源且R所在的包名未知时还是很有用的(如果在gradle里修改了packageName, R所在的包名是和packageName不一样的,没法反射),当然也是有解决的办法: 如果愿意,是可以根据业务拼接出 “package_name.R.drawable.class” 的。但是如果这样的话,视具体情况一定有更好的解法。
胖虎哥
2023/05/10
2.5K0
WordPress 技巧:找到最顶层父页面的 ID
如果你的页面结构有多层级,下面的代码可以找到某个页面最顶层的父页面 ID: <?php if ($post->post_parent) { $ancestors = get_post_ancesto
Denis
2023/04/13
4550
go语言获取协程id
package main import (    "bytes"    "fmt"    "runtime"    "strconv"    "time" ) func main() {    go func() {       gid := GetGid()       fmt.Printf("child goruntine1 gid:%v \n",gid)    }()    go func() {       gid := GetGid()       fmt.Printf("child goru
仙士可
2022/03/28
3K0
分类页权重高,产品页权重低不收录咋办?
树形结构对大部分网站来说是最优化的,若是域名权重比较低,就算网站扁平,最终产品页还是权重过低,无法达到搜索引擎蜘蛛抓取的最低标准,这个时候可以考虑彻底改变树形结构了。
茹莱神兽
2022/08/24
9040
分类页权重高,产品页权重低不收录咋办?
php 获取连续id,WordPress文章ID连续及ID重新排列的方法
解决Wordpress 文章 ID连续问题,同时让Wordpress 文章 ID重新排列。在用以下方法前,先备份好网站文件和数据库文件,以免操作不当造成损失。哈哈哈
超级小可爱
2023/02/20
9.3K0

相似问题

获取当前活动页面的分类ID

131

获取Wordpress分类页面的根术语ID

20

WordPress -获取包含页面的短代码页ID

13

创建分类后获取分类ID - wordpress

11

如何显示Wordpress分类页面的自定义分类?

118
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文