Tag:

如何在ruby中将类名作为变量传递

我有由另一个文件创建的foo.rb和main.rb文件。 foo.rb: class Foo def initialize @val = 1 end end main.rb的: file_name = gets.chomp() require_relative(file_name) class_name = file_name.capitalize a = class_name.new() p “This is val: #{a.val}” 但是我得到一个错误: undefined method new’for“Foo.rb”:String(NoMethodError)` 我的问题:如何将类名作为值传递。

在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模拟类?

我正在使用minitest / mock并且想要模拟一个类。 我不是试图测试模型类本身,而是试图测试服务(SomeService)与模型(SomeModel)的交互。 我想出了这个(Hack :: ClassDelegate),但我不相信这是个好主意: require ‘minitest/autorun’ require ‘minitest/mock’ module Hack class ClassDelegate def self.set_delegate(delegate); @@delegate = delegate; end def self.method_missing(sym, *args, &block) @@delegate.method_missing(sym, *args, &block) end end end class TestClassDelegation < MiniTest::Unit::TestCase class SomeModel < Hack::ClassDelegate ; end class SomeService def delete(id) SomeModel.delete(id) end end def test_delegation id = '123456789' mock = […]

(在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类方法与特征类中的方法

类的本征类(或元类)中的类方法和方法只有两种方法来定义一个东西吗? 否则,有什么区别? class X # class method def self.a “a” end # eigenclass method class << self def b "b" end end end Xa和Xb表现有何不同? 我认识到我可以通过打开本征类来覆盖或别名类方法: irb(main):031:0> class X; def self.a; “a”; end; end => nil irb(main):032:0> class X; class < # irb(main):033:0> Xa => “a” irb(main):034:0> Xb => “a” irb(main):035:0> class X; class < nil […]

超类不匹配,结构,重装和Spork

假设有以下课程 # derp.rb class Derp < Struct.new :id end 当我load “./derp.rb”两次时程序失败并出现TypeError: superclass mismatch for class Derp load “./derp.rb” TypeError: superclass mismatch for class Derp 。 好的,这可以通过require来管理。 但是如何使用Spork为每次测试重新加载这些类? require显然不会工作因为它缓存加载的文件。

如何从Ruby中的字符串“A :: B :: C”获取类对象?

以下示例失败 class A class B end end p Object.const_get ‘A’ # => A p Object.const_get ‘A::B’ # => NameError: wrong constant name A::B UPDATE 前面提到的关于这个主题的问题 在String和Classname之间转换 Ruby String#to_class 在Ruby中按名称获取课程? 最后一个提供了一个很好的解决方案 ,可以演变成 class String def to_class self.split(‘::’).inject(Object) do |mod, class_name| mod.const_get(class_name) end end end class A class B end end p “A::B”.to_class # => A::B

Ruby / Rails – 如何创建类并从Controller访问它

我一直在尝试使用一些不同的gem在rails 3中显示googlemaps并且遇到了一些问题。 幸运的是我找到了这个https://github.com/YouthTree/bhm-google-maps这是一个帮手,它似乎适用于其他人。 我已正确安装它,但在自述文件https://github.com/YouthTree/bhm-google-maps/blob/master/README.md中,它提到为要在视图中显示的对象创建一个类。 他们给出的例子是 class Location attr_accessor :address, :lat, :lng def initialize(address, lat, lng) @address = address @lat = lat @lng = lng end def to_s; address.to_s; end end 然后跑 在视图中。 这看起来很简单但我没有经历过在rails之前创建类的需要,所以我有一些问题。 我应该创建一个location.rb文件并将上面的代码放在其中,但是我应该在哪里放置文件? (模型文件夹,应用程序文件夹????) 有没有办法在我的控制器中创建这个类? 理想情况下,我想将lat / lng值作为变量进行操作并显示动态映射。

如何 – 没有inheritance – 覆盖类方法并从新方法中调用原始方法?

我找到了一个成功覆盖Time.strftime源代码,如下所示: class Time alias :old_strftime :strftime def strftime #do something old_strftime end end 麻烦的是, strftime是一个实例方法。 我需要覆盖Time.now – 一个类方法 – 在任何调用者获取我的新方法的同时,新方法仍然调用原始的.now方法。 我看过alias_method并没有成功。

在什么情况下我应该使用实例变量而不是其他变量类型?

我正在使用Ruby on Rails 3,我想知道在什么情况下我应该使用实例变量而不是其他变量类型,如果有安全原因那些。 例: # Using an instance variable @accounts = Account.find(…) # Using a “local”\”normal” variable account = Account.find(…)