Ruby库,比如Hashie,可以使用lambdas作为属性

Ruby库,比如Hashie,可以使用lambdas作为属性,ruby,hash,configuration,Ruby,Hash,Configuration,是否有一个Ruby库可以像Hashie一样工作,只是它可以将lambda作为属性,并在访问该属性时调用它 例如,我想要这样的东西: # Lash = Lambda-able hash lash = Lash.new( someProperty: "Some value", someOtherProperty: ->{ Time.now } ) lash.someProperty # => "Some value" lash.someOtherProper

是否有一个Ruby库可以像Hashie一样工作,只是它可以将lambda作为属性,并在访问该属性时调用它

例如,我想要这样的东西:

# Lash = Lambda-able hash
lash = Lash.new(
  someProperty:      "Some value",
  someOtherProperty: ->{ Time.now }
)

lash.someProperty      # => "Some value"
lash.someOtherProperty # => 2013-01-25 16:36:45 -0500
lash.someOtherProperty # => 2013-01-25 16:36:46 -0500

以下是我的实现:

class Lash < BasicObject
  def self.new hash
    ::Class.new do
      hash.each do |key, value|
        method_body = if value.respond_to? :call
                        ->(*args){ self.instance_exec(*args, &value) }
                      else
                        ->{ value }
                      end
        define_method(key, &method_body)
      end
    end.new
  end
end
class Lash(*args){self.instance_exec(*args,&value)}
其他的
->{value}
结束
定义方法(键和方法体)
结束
完.新
结束
结束

几天前我想要类似的东西,最后使用了Hashie 2.0.0.beta,它为您提供了扩展,您可以使用自己的
Hash
子类:

require 'hashie'
require 'hashie/hash_extensions' 

class Lash < Hash
  include Hashie::Extensions::MethodAccess

  def [](key)
    val = super(key)
    if val.respond_to?(:call) and val.arity.zero?
      val.call
    else
      val
    end
  end
end
或者,如果没有Bundler,则使用
特定的\u安装
gem:

gem install specific_install
gem specific_install -l git://github.com/intridea/hashie.git

它不会有通用性,因为只有当proc的arity为零时它才有意义。为什么它没有通用性?当值是proc时,您希望它被自动计算(调用),对吗?如果它有一个论点,那么是什么提供了论点?除非它的arity为零,否则不能在没有参数的情况下调用proc。如果proc/lambda有参数,则应使用参数调用它。例如,
lash.somePropertyThatTakesArguments(someArgument)
。其次,更重要的是,如果您不需要参数,不要给它一个接受参数的块。
gem 'hashie', :git => 'git://github.com/intridea/hashie.git'
gem install specific_install
gem specific_install -l git://github.com/intridea/hashie.git