首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >水晶郎的** (双击)是做什么的?

水晶郎的** (双击)是做什么的?
EN

Stack Overflow用户
提问于 2022-06-23 08:27:16
回答 1查看 64关注 0票数 2

在这个方法中,**前缀是如何使用Crystal-lang调用的?这是神社文件包里的。你能解释一下我怎么用双板吗?

代码语言:javascript
复制
class FileImport::AssetUploader < Shrine
  def generate_location(io : IO | UploadedFile, metadata, context, **options) HERE
    name = super(io, metadata, **options)

    File.join("imports", context[:model].id.to_s, name)
  end
end

FileImport::AssetUploader.upload(file, "store", context: { model: YOUR_ORM_MODEL } })
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-06-23 21:08:29

根据官方文件

双splat (**)捕获其他参数不匹配的命名参数。参数的类型是NamedTuple。

代码语言:javascript
复制
def foo(x, **other)
  # Return the captured named arguments as a NamedTuple
  return other
end

foo 1, y: 2, z: 3    # => {y: 2, z: 3}
foo y: 2, x: 1, z: 3 # => {y: 2, z: 3}

双分片的有用之处在于它捕获了所有命名的参数。例如,您可以创建一个函数来处理任意数量的关键字参数。

代码语言:javascript
复制
def print_any_tuple_with_any_keys(**named_tuple)
  named_tuple.each { |k, v| puts "Options #{k}: #{v}" }
end
 
print_any_tuple_with_any_keys(api: "localhost")
print_any_tuple_with_any_keys(fruit: "banana", color: "yellow")
print_any_tuple_with_any_keys(hash: "123", power: "2", cypher: "AES")

这将产生以下结果:

代码语言:javascript
复制
Options api: localhost
Options fruit: banana
Options color: yellow
Options hash: 123
Options power: 2
Options cypher: AES

在您提供的代码中,传递给generate_location的与iometadatacontext不匹配的所有其他命名参数都将传递给调用父类的超级函数,在本例中是一个Shrine类。神殿的具体用途是,它们为不同的存储引擎提供了通用的上传功能,任何额外的参数都可以或不被使用到调用树中,对于AWS S3存储,可能有一个元数据参数将元数据添加到文件中。

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

https://stackoverflow.com/questions/72726947

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档