语法错误,意外'}',期待keyword_end}

时间:2017-08-03 10:04:14

标签: 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 = {
    "chrome" => Watir::Browser.new:chrome,
    "firefox" => Watir::Browser.new:firefox,
    "ie" => Watir::Browser.new:ie
}
  

语法错误,意外'}',期待keyword_end       }

为什么会这样?有没有办法可以隐式编写而不将它们分配给单独的变量?

4 个答案:

答案 0 :(得分:6)

这里有一些稍微不正确的语法,在new调用结束时有一个冒号(:)。例如。

chrome = Watir::Browser.new:chrome

这可能会混淆散列解析器,它可以使用冒号作为键/值分隔符,因为ruby 1.9。 E.g。

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)
}

答案 1 :(得分:4)

我认为这是问题

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

将其更改为(参数的paranthesis)

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

或(参数前的空格)

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

答案 2 :(得分:3)

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

{ 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) }

答案 3 :(得分:1)

您在浏览器名称参数前缺少空格。 给予paranthesis或空间。 或者动态地做它。 任何这些帖子都可以帮助你进行stackoverflow -

  

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

     

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

否则,

  

与Watir vs Webdriver进行比较,请访问 -   External Link

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