在这个方法中,**前缀是如何使用Crystal-lang调用的?这是神社文件包里的。你能解释一下我怎么用双板吗?
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 } })发布于 2022-06-23 21:08:29
根据官方文件
双splat (**)捕获其他参数不匹配的命名参数。参数的类型是NamedTuple。
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}双分片的有用之处在于它捕获了所有命名的参数。例如,您可以创建一个函数来处理任意数量的关键字参数。
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")这将产生以下结果:
Options api: localhost
Options fruit: banana
Options color: yellow
Options hash: 123
Options power: 2
Options cypher: AES在您提供的代码中,传递给generate_location的与io、metadata或context不匹配的所有其他命名参数都将传递给调用父类的超级函数,在本例中是一个Shrine类。神殿的具体用途是,它们为不同的存储引擎提供了通用的上传功能,任何额外的参数都可以或不被使用到调用树中,对于AWS S3存储,可能有一个元数据参数将元数据添加到文件中。
https://stackoverflow.com/questions/72726947
复制相似问题