【问题标题】:Ruby syntax error unexpected tLABELRuby 语法错误意外 tLABEL
【发布时间】:2018-06-19 01:03:18
【问题描述】:

我对@9​​87654321@ 有以下配置,改编自 rails doc:

Rails.application.configure do
  ...
  config.cache_store = :redis_cache_store, url: "redis://example.com:6379/0"
  ...
end

使用 rails 5.2.0.beta2 和 ruby​​ 2.3.1p112,我的 IDE 告诉我有关 config.cache_store = 行的以下信息:

  • 忽略未使用的文字
  • 语法错误,意外的 tLABEL

如果我将散列包含在 {} 中,错误就会消失,即:

config.cache_store = :redis_cache_store, { url: "redis://example.com:6379/0" }

是文档有误,还是 ruby​​ 版本的问题(例如,文档可能假设 ruby​​ >= 2.4)?

无论如何,我不明白分配实际上在做什么 - 如何将两件事分配给一个?

【问题讨论】:

  • 我认为这个案例说明了在多重赋值中,你不能省略散列周围的大括号。
  • 如何进行多重赋值呢? a, b = c, d 我明白,但这更像是b = c, d(大括号与否)。
  • 没错。 Ruby 试图将其解释为一个数组。我要说的是a = b, ca = [b, c]的缩写)和a = [b, c: d]a = [b, {c: d}]的缩写)是允许的,但a = b, c: d可能是不允许的。
  • 好吧,我明白了! a = b, c 等同于 a = [b, c] 是我所缺少的。

标签: ruby syntax


【解决方案1】:

当配置块命中 cache_store 并给出一个符号时,它假定它是一个缓存存储类并执行以下操作:

:redis_cache_store.to_s.classify.constantize
# => RedisCacheStore

这大概是一个类。你可以通过查看 the docs 并看到你也可以通过一个类来推断 Rails 这样做。

RedisCacheStore 定义在 ActiveSupport::Cache 命名空间内,该命名空间继承自 ActiveSupport::Cache::Store,后者在 cache.rb 中定义。这个商店类只用options = nil的单个参数初始化:

def initialize(options = nil)
  @options = options ? options.dup : {}
end

表示需要传递哈希。由于某种原因,它不会使用options = {} 进行初始化,这会使您的初始代码正确。因此,像在第二个示例中那样传递哈希解决了错误。

【讨论】:

  • 很好的答案。为什么options = {} 的默认参数会解决 OP 的问题(这似乎是解析错误)?
  • 很好的问题,我不完全有资格回答,因为我对 Ruby 解释器的工作原理知之甚少,但根据我的经验,它表明表达式或块没有正确结束。我不确定解析器在堆栈的哪个位置遇到此错误,因此我无法回答调用此错误的特定方法。
  • 我不确定我是否理解。您是说(由于元编程)该行大致相当于:config.cache_store = RedisCacheStore?我不明白尾随的, url: ... 是如何适应的。
  • 这个答案中的解释是关于在没有语法错误的情况下完成解析后会发生什么。然而,问题是关于语法错误。因此,这个答案与问题无关。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-11
  • 1970-01-01
  • 1970-01-01
  • 2018-08-03
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多