【问题标题】:Ruby 2.1.3 options hash cannot be assigned with fetchRuby 2.1.3 选项哈希不能用 fetch 分配
【发布时间】:2015-05-13 15:42:16
【问题描述】:

请向我解释为什么会这样:

def resizeImage(event_file, resize_width, resize_height, options = {})
  puts options
  aspect_ratio = options.fetch(:maintain_aspect_ratio, true)
  puts aspect_ratio
  "return value"
end


resizeImage('event_file', 'resize_width', 'resize_height', {maintain_aspect_ratio: false} )
{:maintain_aspect_ratio=>false}
false
 => "return value" 

我想将一个变量设置为 = 从哈希中提取,以使我的代码更具可读性。但是由于某种原因,当我调用它时它是 nil 。看起来 fetch 几乎是异步的,但这不是 ajax。

我知道这是一个非常基本的问题,但据我所知,我正在做的事情就像在不止一个 ruby​​ 方法中使用选项的指南中描述的那样。

-- 更新--

所以现在我让它返回其他东西来尝试分离问题。我看到 aspect_ratio 的 puts 语句实际上根本没有返回任何东西。发生了什么?

-- 更新2--

好吧,我搞糊涂了。它返回错误。所以我的真实方法还有其他问题。感谢您的宝贵时间,我会接受最详细的回答,但我很感激。

【问题讨论】:

    标签: ruby hash fetch options


    【解决方案1】:

    从你的方法中删除这一行:

    puts aspect_ratio
    

    您的 Ruby 方法正在返回最后一条语句的值,即 puts 的值。

    当您删除该行时,您的方法将返回 aspect_ratio

    【讨论】:

    • p aspect_ratio 没问题。
    【解决方案2】:

    实际上,您的结构正确,但是您方法中的最终放入导致返回值为零。 Ruby 使用隐式返回,因此除非指定,否则它将返回方法的最后一个值。从方法中删除puts aspect_ratio,或确保最后一行是aspect_ratio,该方法将正确返回您的值

    def resizeImage(event_file, resize_width, resize_height, options = {}) 
      puts options
      aspect_ratio = options.fetch(:maintain_aspect_ratio, true)
      puts aspect_ratio #remove this line
      aspect_ratio
    end
    

    这最终可以缩短为

    def resizeImage(event_file, resize_width, resize_height, options = {}) 
      options.fetch(:maintain_aspect_ratio, true)
    end
    

    【讨论】:

    • 我明白了。谢谢你和上面的人的回答,你是对的。但这是否意味着我不能在方法中使用 aspect_ratio (显然我试图简化问题)。如何在方法中访问纵横比?我将修改我上面的问题来说明。
    • 您可以在方法中添加任意数量的 puts 语句(或在整个过程中继续使用纵横比)。重要的一点是,您要确保方法的最后一行返回您希望方法返回的值。因为你想返回 aspect_ratio,所以你的最后一行不能被 put(aspect_ratio),因为 puts 返回 nil。
    • 是的。对不起,我做了一个错误的假设。我正在更新现有的工作方法以使用选项而不是强制性纵横比字段。当我改为通过选项定义变量后它停止工作时,我认为问题出在选项上。但实际上这可能只是我在 rails 中的模块资产出现问题并且没有持续更新。
    • 实际上真正的问题是我忘记了我在终端中打开的另一个版本的 repo 中有一个不同的分支,并且从错误的 repo 启动 rails。简单的工作流程〜这是您所做的更改似乎没有发生的一个很好的原因。
    【解决方案3】:

    @joelparkerhendersons 的答案是正确的

    我要解释发生了什么。

    ruby 中的所有东西都会返回一些东西(除了极少数)。可以使用return强制,但默认返回方法的最后一行。

    您的方法 resizeImage 返回 puts 返回的内容。 puts 返回nil

    因此,正如@joelparkerhendersons 建议的那样,删除puts

    【讨论】:

      猜你喜欢
      • 2017-11-07
      • 2017-02-22
      • 1970-01-01
      • 1970-01-01
      • 2013-01-29
      • 2012-01-02
      • 2012-01-30
      • 1970-01-01
      • 2014-03-03
      相关资源
      最近更新 更多