对象创建中的解构赋值

2024-01-06

和我的一样上一个问题 https://stackoverflow.com/questions/69137422/confusing-fmt-behavior-with-nested-lists,这是一个我无法判断我对 Raku 语义的理解是否遇到错误或漏洞的区域。上次竟然是bug,不过怀疑闪电会劈两次!

一般来说,我知道我可以使用看起来很像创建 Pair 的语法将命名参数传递给函数(例如f :a(42)) 或语法为看起来很像 https://twitter.com/jnthnwrthngtn/status/1432395855819063301展平哈希(例如,f |%h). (see 论证解构 https://docs.raku.org/type/Signature#index-entry-destructuring_arguments在文档中)。通常,这两者是等效的,即使对于非标量参数也是如此:

sub f(:@a) { dd @a }
my %h = a => [4, 2];
f :a([4,2]);  # OUTPUT: «Array element = [4, 2]»
f |%h;        # OUTPUT: «Array element = [4, 2]»

但是,当使用默认构造对象时.new构造函数,这两种形式似乎给出了不同的结果:

class C { has @.a; }
my %h = a => [4, 2];
C.new: :a([4,2];  # OUTPUT: «C.new(a => ([[4, 2]])»
C.new: |%h;       # OUTPUT: «C.new(a => [[4, 2],])»

也就是说,通过:a([4,2])会产生一个二元素数组,但使用参数扁平化语法会产生一个包含二元素数组的单元素数组。

这种行为是故意的吗?如果是这样,为什么?我可以使用语法来传递|%h并获取绑定到一个的二元素数组@- 签名属性? (我知道使用$-sigiled 属性有效,但我更喜欢的语义@).


这种行为是故意的吗?

是的。参数绑定使用绑定语义,而属性初始化使用赋值语义。分配到数组方面Scalar容器,以及 a 的值Hash are Scalar容器。

如果是这样,为什么?

直觉是:

  • 当调用一个函数时,在它返回之前我们不会做任何事情,因此我们可以有效地借出我们在它执行时传递给它的相同对象。因此,绑定是一种明智的默认设置(但是,可以使用is copy在参数上获取赋值语义)。
  • 当创建一个新对象时,它很可能会在构造函数调用之后继续存在。因此,复制(即赋值)语义是一个合理的默认值。

是否有语法可以用来传递 |%h 并获取绑定到 @-sigiled 属性的二元素数组?

强制将其变成Map:

class C { has @.a; }
my %h = a => [4, 2];
say C.new: |%h.Map;

或者从一个开始Map首先:

class C { has @.a; }
my %h is Map = a => [4, 2];
say C.new: |%h;
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

对象创建中的解构赋值 的相关文章

  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 如何将变量插入 PHP 数组?

    我在网上查了一些答案 但都不是很准确 我希望能够做到这一点 id result id info array id Example echo info 0 这有可能吗 您需要的是 不推荐 info array id Example varia
  • 合并 JavaScript 数组中的重复项

    我有一个愚蠢的问题 乍一看似乎很容易解决 但结果却很棘手 我有一个对象数组 每个对象都有两个属性 id 和 value id 2 value 10 id 4 value 3 id 2 value 2 id 1 value 15 我想编写一个
  • 可变参数构造函数中的 SFINAE

    我想定义一个通用的强别名类型 即一个类型 template
  • 在 C 中通过引用传递数组

    我是 C 新手 我有一个疑问 由于 C 函数创建其参数的本地副本 我想知道为什么以下代码按预期工作 void function int array array 0 4 array 1 5 array 2 6 int main int arr
  • Turbo C 阵列问题

    我只是想问一些关于我的代码的事情 define LIM 40 main int day 0 float temp LIM clrscr do printf Enter temperature for day d day scanf f te
  • 从零开始的 numpy 形状意味着什么

    好的 我发现数组的形状中可以包含 0 对于将 0 作为唯一维度的情况 这对我来说是有意义的 它是一个空数组 np zeros 0 但如果你有这样的情况 np zeros 0 100 让我很困惑 为什么这么定义呢 据我所知 这只是表达空数组的
  • Node.js - console.log 不显示数组中的项目,而是显示 [Object]

    我在注销对象内数组的内容时遇到问题 实际的物体看起来像这样 var stuff accepted item1 item2 rejected response Foo envelope from The sender to new item1
  • 按范围迭代数组

    我有一个数组 1 2 3 4 5 6 100 我希望将此数组迭代 5 次 具体来说 取数组的前 5 个数字并获取平均值 继续处理接下来的 5 个数字并获取平均值 依此类推 我尝试过多种方法 例如Dequeue和 for 循环但未能获得所需的
  • 结构体指针的动态数组

    我必须使用以下代码块来完成学校作业 严格不进行任何修改 typedef struct char firstName char lastName int id float mark pStudentRecord pStudentRecord
  • 如何正确更新反应钩子状态内的数组

    我一直在尝试更新代表反应状态的数组内的对象 当输入的值更改时应该更新该对象 我可以自己找到一种方法来更新它 但我不太确定这是正确的方法 因为当我打开反应开发工具并转到组件选项卡并单击我正在处理的组件时 在输入输入时状态不会立即更新 并且为了
  • 如果存储字符串的 char 数组小于字符串,C++ 真正将字符串存储在哪里?

    我正在测试 C Premiere 书中有关 C 字符串的示例 const int size 9 char name1 size char name2 size C owboy 8 characters here cout lt lt How
  • 使用 equals 方法比较两个对象,Java

    我有一个对象数组 我想将它们与目标对象进行比较 我想返回与目标对象完全匹配的对象的数量 这是我的计数方法 public int countMatchingGhosts Ghost target int count 0 for int i 0
  • 在 C# 中何时使用 ArrayList 而不是 array[]?

    我经常使用一个ArrayList而不是 正常 array 当我使用时 我感觉好像我在作弊 或懒惰 ArrayList 什么时候可以使用ArrayList在数组上 数组是强类型的 并且可以很好地用作参数 如果您知道集合的长度并且它是固定的 则
  • 如何 free() 由 malloc() 分配的结构数组?

    我一直在研究一个使用结构作为字符串存储的项目 我声明了一个由 char 类型成员组成的结构 struct datastore1 char name 50 char address 50 char email 50 char number 5
  • SSRS 报告服务 - 字符串中的粗体字

    出版物 如何在字符串中加粗作者姓名 如果返回 1 个值 但它是一个字符串 情况会是这样的 iif Fields Author Value Parameters 5aAuthor Value Bold Normal 示例 作者 年份 标题 期
  • 无法实例化类对象的类型 (Java)

    这是我收到错误的代码 在 new 之后的第二个 Killer 处 String classes new String 5 kills 0 Brian Moser kills 1 James Doakes kills 2 Lila Tourn
  • 如何在android中实例化一个类,它也是一个活动?

    在android中 我怎样才能创建一个constructor for a class这也是一个Activity 我的问题是 我想要两个活动类 estimateFare 和 Mapping 它们都将数据发送到活动类 CalculateFare
  • Java数组,NullPointerException?

    我宣布了两张牌 Card card1 new Card 3 Card Suit clubs Card card2 new Card T Card Suit diamonds 这有效 Hand hand1 new Hand hand1 tak
  • 如何从另一个数组值中过滤数组值并返回新数组? [复制]

    这个问题在这里已经有答案了 我有两个数组 all languages and taken languages 第一个包含所有语言 例如 200 种或其他语言 第二个包含之前选择的语言 从 0 到 200 种 我需要删除所有已采用的语言 ta

随机推荐

  • Swift 中两个弱变量相互引用?

    今天我再次尝试理解 Swift 中的保留循环和弱引用 阅读通过文档 https developer apple com library ios documentation Swift Conceptual Swift Programming
  • 可视化解决方案资源管理器中的实际文件夹?

    MS Visual Studio 有解决方案资源管理器 我可以在其中查看所有项目文件 我还可以创建类似于文件文件夹的过滤器 以将它们分组 问题是 我希望我的文件在磁盘上的视觉和物理上分组 但我不想在视觉和磁盘上应用每个更改两次 有没有什么方
  • Go中的PostgreSQL列表参数(使用数据库/SQL和pq)

    我正在尝试编写一个采用列表参数 即作为值列表的单个参数 的查询 看来这在 PostgreSQL 中至少有时是可能的 https stackoverflow com a 10829760 836390 https stackoverflow
  • Swing 组件何时“可显示”?

    有没有办法 例如 通过事件 来确定 Swing 组件何时变为 可显示 根据 JavadocsComponent getGraphics http java sun com j2se 1 5 0 docs api java awt Compo
  • HttpClient - 处理聚合异常

    您好 我正在使用与此类似的 HttpClient public static Task
  • github 上的 Teamcity 构建徽章

    我想在我的 github 页面上添加 teamcity 构建徽章 我的存储库是私有 github 存储库 我首先将下面的代码包含为link https blog jetbrains com teamcity 2012 07 teamcity
  • 定义实体框架 1:1 关联

    我试图在实体框架模型中定义两个实体之间的 1 1 关联 一个映射到表 另一个映射到视图 使用 DefinedQuery 当尝试在设计器中定义映射时 它让我选择 1 表或视图来映射关联 我应该选择什么 我可以选择两个表中的任何一个 但随后我被
  • 更新 Ruby on Rails 控制器中的参数

    我有一个控制器 我想在更新之前更新其中一个参数的值 以便在同一个保存到数据库的操作中进行更新 不幸的是 下面的代码没有设置z在数据库中 if model x YES model z blank model params z Time now
  • 如何在Eclipse的“运行配置”中设置“主类”

    在一个Java项目中 有两个java文件都有main方法 这两个java文件的绝对路径是 C Desktop project1 src com pre moveposition1 java And C Desktop project1 sr
  • TypeError:TextIOWrapper 类型的对象不可 JSON 序列化

    如果代码正常工作 那么每当有人在聊天中输入内容时 他们都会获得 5 经验 并且该信息会被放入 json文件 但发生的情况是每当有人在聊天中输入内容时就会出现此错误 on message users json dumps f TypeErro
  • Visual Studio Code 语言扩展继承现有的

    在 Visual Studio Code 中 只需提供语法文件即可添加自己的语言扩展 例如通过 JSON 我想为我使用的特定脚本语言提供语法文件 脚本语言嵌入在 ARM 汇编源代码中 并且已经存在一个插件 所以我基本上想通过我的脚本语言来扩
  • Log4j 1:如何在不更新版本到2.15.0的情况下缓解Log4j中的漏洞

    我正在使用 Log4j 1 2 16 我将其与 Maven 一起使用Selenium https en wikipedia org wiki Selenium 28software 29测试Java项目 我正在寻找一种无需升级Log4j版本
  • 创建动态 php 插入 mysql 函数?

    我有一篇包含很多变量的帖子 我想知道是否有某种方法可以动态地将信息插入到 mysql 中 而不是手动全部输入 因为帖子变量会根据用户选择的内容而变化 这就是我们用来做类似事情的方法 插入到我们无法控制的表中 并且没有 API 访问权限 使用
  • 如何在使用 Core Graphics 绘制的图像上设置辅助功能标签?

    我正在尝试围绕一些核心图形逻辑编写 UIAutomation 测试 目前我们正在使用核心图形来绘制图像 我正在尝试在图像上设置可访问性标签 标识符 值 以便我可以通过 UIAutomation 测试验证其存在 但无论我做什么 我都无法在 D
  • ListFragment 未渲染且适配器中的 getView() 未被调用

    据我所知 这可能是因为我的 ListView 没有显示 我已经验证 getCount 返回的值不为零 但我看不出我做错了什么 一切都加载并表现得好像它正在工作 但 ListView 从未出现 我在 mix xml 中的片段引用上放置了背景颜
  • 如何选择特定客户?

    我创建了以下表格 create table customers ID varchar 9 name varchar 15 CONSTRAINT pk id PRIMARY KEY ID create table living places
  • GMail 似乎忽略回复

    我正在使用 Gmail 帐户从我的网站发送电子邮件 我使用同一帐户来接收由我网站上的联系工具生成的电子邮件 我使用 回复 字段是为了更轻松地回复并轻松回复人们 该消息带有 发件人 地址 并忽略 回复 地址 这是我的标题 Return Pat
  • 如何更改 goroutine 闭包内的外部变量的值

    func this l PostUpload ctx Context ctx Response Status 500 l err models NewL this Config go func err l Save file if err
  • 如何从 Playwright 中的表格的特定列获取文本

    我正在使用 Playwright 进行 e2e 测试 我的问题陈述是我想获取表的特定列的所有行的文本内容 有问题的表格就像这里显示的一样 https ant design components table https ant design
  • 对象创建中的解构赋值

    和我的一样上一个问题 https stackoverflow com questions 69137422 confusing fmt behavior with nested lists 这是一个我无法判断我对 Raku 语义的理解是否遇