Tag: 模块

从模块中访问包含类的命名空间

我正在研究一个模块,除其他外,它将为你混合它的类添加一些通用的’finder’类型function。 问题:出于方便和美观的原因,我想在类之外包含一些function,与类本身在同一范围内。 例如: class User include MyMagicMixin end # Should automagically enable: User.name(‘Bob’) # Returns first user named Bob Users.name(‘Bob’) # Returns ALL users named Bob User(5) # Returns the user with an ID of 5 Users # Returns all users 我可以在这些方法中做function,没问题。 案例1( User.name(‘Bob’) )很简单。 但是,案例2-4需要能够在User之外创建新的类和方法。 Module.included方法允许我访问该类,但不允许访问其包含的范围。 在Class和Module上没有简单的“父”类型方法。 (对于命名空间,我的意思是,不是超类,也不是嵌套模块。) 我能想到的最好方法是在类的#name上进行一些字符串解析,以打破其命名空间,然后将字符串转换回常量。 但这看起来很笨拙,鉴于这是Ruby,我觉得应该有更优雅的方式。 有没有人有想法? 或者我只是为了自己的利益而过于聪明?

Ruby模块可以被描述为单例类吗?

我试图从设计模式的角度来理解Ruby模块的目的。 Ruby模块本质上只是一个只初始化一次的类吗? include MyModule

尝试访问包含模块中定义的方法时出现NoMethodError

我正试图从我的一个规范助手中的模块中访问一个方法 我将模块包含在测试助手中 module Support class RestHelper include Rest::Rest def create_rest_client_for_ifa # Call method from module create_rest_client(uname, pword) end end end 但是当我运行我的规范时,我不断收到NoMethodError: Failure/Error: @rest_client = Support::RestHelper.create_rest_client_for_ifa NoMethodError: undefined method `create_rest_client’ for Support::RestHelper:Class 这是我的模块代码: module Rest module Rest . . def create_rest_client(uname, pword) # code end . . end end 当我在rails控制台中测试它时似乎工作正常 $ RAILS_ENV=test rails c irb> include […]

如何从Ruby模块中仅导入几个函数?

假设我有一个带有方法的模块:function1,function2,function3。 我想导入function1和function2但不导入function3。 有没有办法在ruby中做到这一点?

通过在使用ActiveSupport :: Concernfunction时将“嵌套”模块包含为该类的实例方法,如何将方法添加到类中?

我正在使用Ruby 1.9.2和Ruby on Rails v3.2.2 gem。 在我之前关于如何在使用Ruby on Rails ActiveSupport :: Concernfunction时 “嵌套”模块的问题之后 ,我想了解我应该通过包含“嵌套”模块来添加到类中的方法,以便制作这个类的实例方法 。 也就是说,我有以下几点: class MyClass < ActiveRecord::Base include MyModuleA end module MyModuleA extend ActiveSupport::Concern included do include MyModuleB end end module MyModuleB extend ActiveSupport::Concern included do # def my_method # … # end end # def my_method # … # end end […]

从模块访问会话变量或控制器变量

使用:Rails 3.0.3 我有我的网站的这个function(计算计算.com),包括大量不同的计算。 用户可以通过表单为小数(有效数字)设置自己的变量。 首先,我将此变量设置为configatron变量,结果certificate是一个坏主意(某些用户所做的更改已传递给所有用户)。 所以,我决定把它变成一个会话变量,这是有道理的,因为用户应该选择自己的十进制值。 现在,在控制器中我调用一个模块函数,该函数依次调用100个不同的模块函数。 我的问题: 我想在该模块中访问此会话变量,结果certificate这是不可能的。 已经从控制器(通过模型)传递它是一个噩梦,因为它需要为每个function传递。 所以: 如何从lib-catalog中的模块访问会话变量? 如何从模块访问控制器方法? 如果是这样,我可以调用该方法并获取会话变量。

在instance_eval / exec或module_eval / exec中的Module.nesting

当我试图回答这个问题时,我提出了这个问题。 以下是预期的行为: module A p Module.nesting end # => [A] 但以下内容: A.instance_eval{p Module.nesting} A.instance_exec{p Module.nesting} A.module_eval{p Module.nesting} A.module_exec{p Module.nesting} 全部归还[] 。 为什么这些不能像上面这样工作? 补充问题 穆太短表示一个有趣的观点。 如果这是正确的,那么Module.nesting将是依赖于文字上下文的方法和变量之一,如Method#source_location , __FILE__ 。 这种理解是否正确? 如果是这样,有人可以提供依赖于文字上下文的这些方法/变量的清单吗? 我认为这对参考有用。

(在Ruby中)允许混合类方法访问类常量

我有一个定义了常量的类。 然后我定义了一个访问该类常量的类方法。 这很好用。 一个例子: #! /usr/bin/env ruby class NonInstantiableClass Const = “hello, world!” class << self def shout_my_constant puts Const.upcase end end end NonInstantiableClass.shout_my_constant 我的问题出现在尝试将此类方法移出到外部模块,如下所示: #! /usr/bin/env ruby module CommonMethods def shout_my_constant puts Const.upcase end end class NonInstantiableClass Const = “hello, world!” class << self include CommonMethods end end NonInstantiableClass.shout_my_constant Ruby将该方法解释为从模块而不是类中请求常量: line 5:in `shout_my_constant’: uninitialized […]

在Ruby或Rails中,为什么有时在课堂上“包括”,有时候在课堂外?

我想 class ApplicationController < ActionController::Base include Foo 是添加“mixin” – 以便将Foo模块中的所有方法都视为ApplicationController的方法。 但现在我看到了代码 include Bar class ApplicationController < ActionController::Base include Foo 那为什么它在ApplicationController之外呢? 这与将它放在ApplicationController的更常见用法有什么不同?

如何选择在Ruby中动态包含哪个版本的模块?

我正在编写一个小型的Ruby命令行应用程序,它使用标准库中的fileutils进行文件操作。 根据用户调用应用程序的方式,我将要包括FileUtils , FileUtils::DryRun或FileUtils::Verbose 。 既然include是私有的,我不能把逻辑选择到对象的initialize方法中。 (这是我的第一个想法,从那时起我就可以将有关用户选择的信息作为参数传递给new 。)我已经提出了两个似乎有用的选项,但我对以下两种方法都不满意: 根据用户的选择在应用程序的命名空间中设置一个全局变量,然后在类中执行条件包含: class Worker case App::OPTION when “dry-run” include FileUtils::DryRun etc. 创建子类,唯一的区别是它们包含哪个版本的FileUtils 。 根据用户的选择选择合适的一个。 class Worker include FileUtils # shared Worker methods go here end class Worker::DryRun < Worker include FileUtils::DryRun end class Worker::Verbose < Worker include FileUtils::Verbose end 第一种方法似乎是DRY-er,但我希望有一些我没有想到的更简单的方法。