- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我在编写 ruby 代码时遇到了一个奇怪的情况:
def foo(bar=true,baz,*args)
end
引发此错误:
syntax error, unexpected tSTAR
而这些:
def foo(bar,baz=true,*args)
end
def foo(bar=true,baz=true,*args)
end
没问题。
更奇怪的是,这些:
def foo(bar,baz=true)
end
def foo(bar=true,baz)
end
两者都有效。
但是,这:
def foo(bar=true,baz,args=true)
end
引发错误,但是这些:
def foo(bar=true,baz=true,args)
end
def foo(bar,baz=true,args=true)
end
很好。
我想有一个合乎逻辑的原因可以解释为什么允许某些组合而不允许其他组合,但我无法在任何地方找到它们,无论是通过谷歌还是搜索 stackoverflow。我的问题很简单:为什么允许其中一些组合,而另一些则不允许?
最佳答案
现有的 Ruby 书籍详细解释了这一点。但即使没有,您也会习惯它的逻辑。一个体面的编码器定义的函数首先是强制性的有序参数,如下所示:
def foo( a, b, c=0, d=0 )
# ...
end
简单地说,前 2 个参数转到 a
、b
,最多 2 个可选参数转到 c
、d
,按此顺序。但是你被授予了超越普通礼仪的自由:
def foo( a=0, b )
# ...
end
如果您提供 1 个参数,它将转到 b
。如果您提供 2 个参数,它们将按顺序分配给 a
、b
。这是不太体面的,因为它需要向用户学习更多。如果您自己是用户,那您就是对自己不雅,但是,根本没有句法歧义。现在看看这个:
def foo( a=0, b, c=0 )
# ...
end
如果你调用 foo( 1, 2 )
,你的意思是 a = 1
, b = 2
, c = 0
,或者 a = 0
,b = 1
,c = 2
?也许第一个更有可能,但编码规则是,不要猜测用户的意图。因此,Ruby 团队可能决定不宠爱这种语法。您仍然可以通过定义来实现它:
def foo( *args )
a, b, c = case args.size
when 1 then [0, args[0], 0]
when 2 then [*args, 0]
when 3 then args
else fail ArgumentError; "#{args.size} arguments for 1..3!" end
# ...
end
因此,事实上,您被授予了绝对的自由,但 Ruby 会引导您进行良好的实践:让好的代码看起来比糟糕的代码更好。这同样适用于使用 * splat 收集参数。体面的情况是明确的:
def foo( a, b=0, *c )
# ...
end
但是有:
def foo( a=0, b, *c )
# ...
end
当您调用 foo( 1, 2, 3 )
时,您的意思是 a = 1
、b = 2
和 c = [3]
,或 a = 0
、b = 1
和 c = [2, 3]
?因此,同样,不鼓励第二种情况,但仍然可以实现:
def foo( *c )
a, b = case c.size
when 0 then fail ArgumentError, "Too few arguments!"
when 1 then [0, c.shift]
else [c.shift, c.shift] end
# ...
end
编写带有许多参数的函数,尤其是带有许多有序参数的函数,是一种不好的做法。有一句老话,二元法优于三元法,一元法优于二元法,最后,一元法优于一元法。如果您的方法需要很多参数,您应该通过 replacing it with an object 重构它.这是否回答了您的问题?
关于ruby - 为什么 ruby 只允许默认参数和 splats 的某些顺序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17005707/
简而言之:我想从可变参数模板参数中提取各种选项,但不仅通过标签而且通过那些参数的索引,这些参数是未知的 标签。我喜欢 boost 中的方法(例如 heap 或 lockfree 策略),但想让它与 S
我可以对单元格中的 excel IF 语句提供一些帮助吗? 它在做什么? 对“BaselineAmount”进行了哪些评估? =IF(BaselineAmount, (Variance/Baselin
我正在使用以下方法: public async Task Save(Foo foo,out int param) { ....... MySqlParameter prmparamID
我正在使用 CodeGear RAD Studio IDE。 为了使用命令行参数测试我的应用程序,我多次使用了“运行 -> 参数”菜单中的“参数”字段。 但是每次我给它提供一个新值时,它都无法从“下拉
我已经为信用卡类编写了一些代码,粘贴在下面。我有一个接受上述变量的构造函数,并且正在研究一些方法将这些变量格式化为字符串,以便最终输出将类似于 号码:1234 5678 9012 3456 截止日期:
MySql IN 参数 - 在存储过程中使用时,VarChar IN 参数 val 是否需要单引号? 我已经像平常一样创建了经典 ASP 代码,但我没有更新该列。 我需要引用 VarChar 参数吗?
给出了下面的开始,但似乎不知道如何完成它。本质上,如果我调用 myTest([one, Two, Three], 2); 它应该返回元素 third。必须使用for循环来找到我的解决方案。 funct
将 1113355579999 作为参数传递时,该值在函数内部变为 959050335。 调用(main.c): printf("%d\n", FindCommonDigit(111335557999
这个问题在这里已经有了答案: Is Java "pass-by-reference" or "pass-by-value"? (92 个回答) 关闭9年前。 public class StackOve
我真的很困惑,当像 1 == scanf("%lg", &entry) 交换为 scanf("%lg", &entry) == 1 没有区别。我的实验书上说的是前者,而我觉得后者是可以理解的。 1 =
我正在尝试使用调用 SetupDiGetDeviceRegistryProperty 的函数使用德尔福 7。该调用来自示例函数 SetupEnumAvailableComPorts .它看起来像这样:
我需要在现有项目上实现一些事件的显示。我无法更改数据库结构。 在我的 Controller 中,我(从 ajax 请求)传递了一个时间戳,并且我需要显示之前的 8 个事件。因此,如果时间戳是(转换后)
rails 新手。按照多态关联的教程,我遇到了这个以在create 和destroy 中设置@client。 @client = Client.find(params[:client_id] || p
通过将 VM 参数设置为 -Xmx1024m,我能够通过 Eclipse 运行 Java 程序-Xms256M。现在我想通过 Windows 中的 .bat 文件运行相同的 Java 程序 (jar)
我有一个 Delphi DLL,它在被 Delphi 应用程序调用时工作并导出声明为的方法: Procedure ProduceOutput(request,inputs:widestring; va
浏览完文档和示例后,我还没有弄清楚 schema.yaml 文件中的参数到底用在哪里。 在此处使用 AWS 代码示例:https://github.com/aws-samples/aws-proton
程序参数: procedure get_user_profile ( i_attuid in ras_user.attuid%type, i_data_group in data_g
我有一个字符串作为参数传递给我的存储过程。 dim AgentString as String = " 'test1', 'test2', 'test3' " 我想在 IN 中使用该参数声明。 AND
这个问题已经有答案了: When should I use "this" in a class? (17 个回答) 已关闭 6 年前。 我运行了一些java代码,我看到了一些我不太明白的东西。为什么下
我输入 scroll(0,10,200,10);但是当它运行时,它会传递字符串“xxpos”或“yypos”,我确实在没有撇号的情况下尝试过,但它就是行不通。 scroll = function(xp
我是一名优秀的程序员,十分优秀!