C#4引入了一个名为命名参数的特性,这在像这样的场景中特别有用
int RegisterUser(string nameFirst, string nameLast, string nameMiddle, string email)
Run Code Online (Sandbox Code Playgroud)
有没有办法强制使用命名参数?也许某些属性适用于我不知道的方法或编译器开关?我想可以使用代码检查器工具完成,但只想知道是否还有其他方法.
PS
对于那些感兴趣的人为什么可能需要它,为什么不使用类/结构来利用对象初始化器,有些情况是不可能的.就像调用不在您控制中的库或您必须遵守的奇怪代码约定一样.
这很简单,我不敢相信它抓住了我.
def meth(id, options = "options", scope = "scope")
puts options
end
meth(1, scope = "meh")
-> "meh"
Run Code Online (Sandbox Code Playgroud)
我倾向于使用哈希作为参数选项,因为它是牧群的做法 - 它非常干净.我认为这是标准.今天,经过大约3个小时的寻找bug之后,我追踪到了一个错误,我碰巧正在使用这个假设命名参数将被尊重.他们不是.
所以,我的问题是:在Ruby(1.9.3)中,命名参数是否正式不受尊重,或者这是我缺少的一个副作用?如果他们不是,为什么不呢?
如果这是一个显而易见的问题,我对Ruby很新,所以道歉.
我想在实例化Struct时使用命名参数,即能够指定Struct中哪些项获取什么值,并将其余项默认为nil.
例如,我想做:
Movie = Struct.new :title, :length, :rating
m = Movie.new :title => 'Some Movie', :rating => 'R'
Run Code Online (Sandbox Code Playgroud)
这不起作用.
所以我想出了以下内容:
class MyStruct < Struct
# Override the initialize to handle hashes of named parameters
def initialize *args
if (args.length == 1 and args.first.instance_of? Hash) then
args.first.each_pair do |k, v|
if members.include? k then
self[k] = v
end
end
else
super *args
end
end
end
Movie = MyStruct.new :title, :length, :rating
m = Movie.new :title => 'Some Movie', :rating => …Run Code Online (Sandbox Code Playgroud) 例如,您可能具有复杂签名和varargs的功能:
fun complicated(easy: Boolean = false, hard: Boolean = true, vararg numbers: Int)
Run Code Online (Sandbox Code Playgroud)
你应该能够像这样调用这个函数是有道理的:
complicated(numbers = 1, 2, 3, 4, 5)
Run Code Online (Sandbox Code Playgroud)
不幸的是,编译器不允许这样做.
是否可以为varargs使用命名参数?有没有聪明的解决方法?
function default-value variadic-functions named-parameters kotlin
我正在寻找将函数与包含比函数输入更多项的字典组合在一起的最佳方法
在这种情况下,基本**kwarg拆包失败:
def foo(a,b):
return a + b
d = {'a':1,
'b':2,
'c':3}
foo(**d)
--> TypeError: foo() got an unexpected keyword argument 'c'
Run Code Online (Sandbox Code Playgroud)
经过一些研究,我想出了以下方法:
import inspect
# utilities
def get_input_names(function):
'''get arguments names from function'''
return inspect.getargspec(function)[0]
def filter_dict(dict_,keys):
return {k:dict_[k] for k in keys}
def combine(function,dict_):
'''combine a function with a dictionary that may contain more items than the function's inputs '''
filtered_dict = filter_dict(dict_,get_input_names(function))
return function(**filtered_dict)
# examples
def foo(a,b):
return a + b
d = …Run Code Online (Sandbox Code Playgroud) 有没有办法在不使用环境变量的情况下将命名参数传递给Rake任务?
我知道Rake任务可以接受两种格式的参数:
环境变量
$ rake my_task foo=bar
Run Code Online (Sandbox Code Playgroud)
这将创建名称的环境变量foo和值bar可在Rake任务进行访问my_task的ENV['foo'].
耙任务参数
$ rake my_task['foo','bar']
Run Code Online (Sandbox Code Playgroud)
此传递的值foo与bar前两个任务参数(如果它们被定义).如果my_task被定义为:
task :my_task, :argument_1, :argument_2
Run Code Online (Sandbox Code Playgroud)
然后argument_1会有价值foo,argument_2并具有价值bar.
当我们创建接口方法时,我们不能像在java中那样做:
void interface_method(Integer,String, /* other parameter */);
Run Code Online (Sandbox Code Playgroud)
相反,我注意到我们还需要提供参数名称lile:
void interface_method(Integer i, String s);
Run Code Online (Sandbox Code Playgroud)
接口实现者也不需要具有与interface方法相同的参数名称.
我在这里发现了一个关于c#的类似问题.他们提到了一个命名参数的场景,但我没有在java中找到任何其他相关的相关原因.
是否可以在groovy中使用默认值命名参数?我的计划是创建一种对象工厂,可以在没有参数的情况下调用它,以获得具有默认值的对象.此外,我需要功能来明确设置对象的任何参数.我相信这可以通过Python关键字参数来实现.
我现在正在尝试的代码如下所示
// Factory method
def createFoo( name='John Doe', age=51, address='High Street 11') {
return new Foo( name, age, address )
}
// Calls
Foo foo1 = createFoo() // Create Foo with default values
Foo foo2 = createFoo( age:21 ) // Create Foo where age param differs from defaut
Foo foo3 = createFoo( name:'Jane', address:'Low Street 11' ) // You get the picture
// + any other combination available
Run Code Online (Sandbox Code Playgroud)
我正在开发的真正应用程序将拥有更多参数,因此需要更多组合.
谢谢
更新:
我计划的工厂方法是用于测试目的.无法真正触及实际的Foo类,尤其不是它的默认值.
下面的@dmahapatro和@codelarks在使用Map作为参数时有一个很好的观点,它让我了解了一个可能的解决方案.我可以使用所需的默认值创建一个地图并覆盖所需的值,并将其传递给工厂方法.这可能会完成这项工作,我将继续这样做,除非我得到一个更好的方法.
我现在的方法如下
defaults = [ name:'john', age:61, …Run Code Online (Sandbox Code Playgroud) 如果我编写这样的函数,可以在PHP中模拟命名函数参数
function pythonic(array $kwargs)
{
extract($kwargs);
// .. rest of the function body
}
// if params are optional or default values are required
function pythonic(array $kwargs = array('name'=>'Jon skeet'))
{
extract($kwargs);
// .. rest of the function body
}
Run Code Online (Sandbox Code Playgroud)
除了在IDE中失去intellisense之外,这种方法的其他可能缺点是什么?
编辑:
安全性:在这种情况下,安全性不应该是非问题,因为提取的变量仅限于功能范围吗?
我有一些构造函数和函数,我希望始终使用命名参数调用.有没有办法要求这个?
我希望能够为具有许多参数的构造函数和函数执行此操作,并且对于那些在使用命名参数时更清楚地读取的函数,等等.