Ruby 语法错误,意外';}';,应为关键字_end}

Ruby 语法错误,意外';}';,应为关键字_end},ruby,syntax-error,Ruby,Syntax Error,我是Ruby的新手,我不太明白这里发生了什么 此代码有效 chrome = Watir::Browser.new:chrome firefox = Watir::Browser.new:firefox ie = Watir::Browser.new:ie browser_conf = { "chrome" => chrome, "firefox" => firefox, "ie" => ie } 但以下代码会产生语法错误: browser_conf

我是Ruby的新手,我不太明白这里发生了什么

此代码有效

chrome = Watir::Browser.new:chrome
firefox = Watir::Browser.new:firefox
ie = Watir::Browser.new:ie

browser_conf = {
    "chrome" => chrome,
    "firefox" => firefox,
    "ie" => ie
}
但以下代码会产生语法错误:

browser_conf = {
    "chrome" => Watir::Browser.new:chrome,
    "firefox" => Watir::Browser.new:firefox,
    "ie" => Watir::Browser.new:ie
}
语法错误,意外“}”,应为关键字\u end }


为什么会这样?有没有一种方法可以在不将它们分配给单独变量的情况下进行隐式编写?

我认为问题就在这里

chrome = Watir::Browser.new:chrome
firefox = Watir::Browser.new:firefox
ie = Watir::Browser.new:ie
将其更改为(辩论用偏执)

或to(参数前空格)


这里有一些不太常见的语法,在
new
调用的末尾有一个冒号(:)。例如

chrome = Watir::Browser.new:chrome
这可能会混淆哈希解析器,因为ruby 1.9可以使用冒号作为键/值分隔符。例如

hash = {foo: 'bar'}
但是,通过将代码放在括号中,始终可以强制对其求值,而不管其周围环境如何。您可能会发现以下代码有效:

browser_conf = {
  "chrome" => (Watir::Browser.new:chrome),
  "firefox" => (Watir::Browser.new:firefox),
  "ie" => (Watir::Browser.new:ie)
}
更新:我刚刚查看了Watir文档,我相信您正在错误地调用
new
。浏览器的符号是
new
的参数。所以应该在空格后,或者在括号中。如果没有空格或括号,它并不总是能够将其解析为参数

以下是正确的代码:

browser_conf = {
  "chrome" => Watir::Browser.new(:chrome),
  "firefox" => Watir::Browser.new(:firefox),
  "ie" => Watir::Browser.new(:ie)
}

浏览器名称参数前缺少空格。 给我一个空间。 或者动态地执行此操作。。 这些帖子中的任何一个都会在stackoverflow-

如果要通过命令行调用不同的环境,请转到-

对于要传递的Ruby符号,请参考-

否则,

使用Watir与Webdriver进行比较,请访问-

您需要对env.sh进行更改,并确保传递“browser type”或等效变量,您可以在配置文件中引用该变量并实例化相应的变量。
希望有帮助

传递不带括号的方法参数很容易变得模棱两可。以此哈希文本为例:

{ 1 => foo 2, 3 => 4 }
这可以解释为:

{ 1 => foo(2, 3 => 4) }
或作为:

{
  1 => foo(2),
  3 => 4
}
对于此数组文字,相同:

[foo 2, 3, 4]
这可能是:

[foo(2, 3, 4)]
[foo(2, 3), 4]
[foo(2), 3, 4]
当Ruby的解析器遇到这种歧义时,它通常会引发一个
SyntaxError
。然后必须显式地提供括号

就你而言:

{ 'chrome' => Watir::Browser.new(:chrome) }

有些人投票决定结束这个问题。!如果有人能解释如何改进这一点,那将非常有帮助。看看edit(),看起来主要的问题是标题没有告诉我们问题是什么。虽然我发现有些用户会尝试关闭问题,如果他们的代码示例是错误的,这对我来说是非常奇怪的,当目标是发现并纠正问题时。“应该在空格[…]之后”–
{'chrome'=>Watir::Browser.new:chrome}
不起作用,括号在这里是必须的。
chrome=Watir::Browser.new:chrome
(没有空格)是不寻常的,但确实有效。您不能忽略散列文字中的括号。
[foo(2, 3, 4)]
[foo(2, 3), 4]
[foo(2), 3, 4]
{ 'chrome' => Watir::Browser.new(:chrome) }