【问题标题】:Method syntax causing confusion导致混淆的方法语法
【发布时间】:2011-05-26 20:42:58
【问题描述】:
def current_user=(user)
    @current_user = user
end

def user_from_remember_token
    User.authenticate_with_salt(*remember_token)
end

def remember_token
    cookies.signed[:remember_token] || [nil, nil]
end

1) 我主要对 def current_user=(user) 感到困惑。 = 是什么意思。我看到它以用户对象作为参数,但是 = 符号的意义何在。

2) 不确定为什么 remember_token 前面有一个 *。谁能解释一下?

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    方法名称末尾的= 是用于分配值的方法的语法糖。由于括号在 Ruby 中是可选的,因此您可以编写 foo.current_user = (bar)foo.current_user = bar。请注意,后者看起来更自然。另请注意,您可以使用attr_writer :current_user

    您还可以在 Ruby 中的方法名称中使用 ?!。按照惯例,前者表示要返回的布尔值,后者表示“危险”方法(例如,修改对象而不是返回副本)。

    * 将传递给该方法的任何内容包装到一个数组中。它也适用于调用方法,然后解包数组。

    || 只是逻辑或;如果第一个操作数的计算结果为nilfalse,则返回另一个。通常你可能会发现foo ||= "bar",这意味着foo 将获得“bar”的值,除非它有一个值(foo = foo || "bar")。

    Ruby 是一门很棒的语言,有很多这样的怪癖。 Rubyist 是一个值得访问的页面。

    【讨论】:

    • TLDR 版本 = ? ! 都是 ruby​​ 方法名称中的合法字符。他们没什么特别的。关于何时使用的约定是否更重要。
    • =?! 可以用在方法名称的末尾。虽然 irb 在声明名为 foo?bar 的方法时不会报错,但它会将该方法记住为 foo?
    • 非常感谢,您真的回答了我的问题!还是习惯了红宝石。不过我听说过很好的事情:)
    • 这是一门很棒的语言,很容易学习。有一本关于 Ruby 的精彩书籍,The Pragmatic Programmer's Guide。我强烈推荐阅读它(链接文档 Ruby 1.6,现在有点过时了;但是你周围的书店应该有更新的版本)。
    【解决方案2】:

    current_user=(user) 是一个允许你执行something.current_user = foo 的设置器。相应的吸气剂将是 current_user 并且看起来像

    def current_user
      @current_user
    end
    

    【讨论】:

      【解决方案3】:

      current_user 前面的= 符号是指attr_writer 方法。

      意思是

       def current_user=(user)
           @current_user = user
       end
      

      参考:

      http://www.rubyist.net/~slagell/ruby/accessors.html    
      http://apidock.com/ruby/Module/attr_writer
      http://ruby-doc.org/core/classes/Module.html
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-05-29
        • 2016-05-13
        • 2017-03-13
        • 1970-01-01
        • 2013-10-09
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多