::做什么?

时间:2011-01-28 14:16:30

标签: ruby-on-rails

我有一些我正在修改的继承代码。但是,我看到一些奇怪的东西(对我而言)。

我看到一些像这样的代码:

::User.find_by_email(params[:user][:email]).update_attributes(:mag => 1)

我从未见过这样的东西(我是Ruby on Rails的新手)。这是做什么的,为什么我的User.find_by_email(params[:user][:email]).update_attributes(:mag => 1)不起作用?错误说明User常量。

如果有帮助,我正在使用Rails 2.3.5。

5 个答案:

答案 0 :(得分:20)

::是一个范围解析运算符,它实际上意味着“在命名空间中”,因此ActiveRecord::BaseBase的命名空间中表示“ActiveRecord

在任何名称空间之外解析的常量意味着它听起来完全是什么 - 根本不在任何名称空间中的常量。

它用于代码可能不明确的地方:

module Document
  class Table # Represents a data table

    def setup
      Table # Refers to the Document::Table class
      ::Table # Refers to the furniture class
    end

  end
end

class Table # Represents furniture
end

答案 1 :(得分:4)

确保在全局命名空间中加载User模型。

想象一下,您的当前模块(Foo :: User)中有一个全局用户模型和另一个用户模型。通过Calling :: User确保获得全局的。

答案 2 :(得分:2)

您可以在此处找到一个主角:What is Ruby's double-colon `::`?

答案 3 :(得分:2)

Ruby使用(除其他外)词法范围来查找常量名称。例如,如果您有此代码:

module Foo
  class Bar
  end

  def self.get_bar
    Bar.new
  end
end

class Bar
end

Foo.get_bar返回Foo::Bar的实例。但是如果我们将::放在常量名称前面,它会强制Ruby只查看常量的顶层。因此::Bar始终引用顶级Bar类。

您将遇到Ruby中的情况,其中您的代码运行方式将迫使您使用这些“绝对”常量引用来到达您想要的类。

答案 4 :(得分:1)

“::”运算符用于访问模块内的类。这样你也可以间接访问方法。例如:

module Mathematics
    class Adder
       def Adder.add(operand_one, operand_two)
           return operand_one + operand_two
       end
    end
end

您可以通过以下方式访问:

puts “2 + 3 = “ + Mathematics::Adder.add(2, 3).to_s