Ruby库,比如Hashie,可以使用lambdas作为属性
是否有一个Ruby库可以像Hashie一样工作,只是它可以将lambda作为属性,并在访问该属性时调用它 例如,我想要这样的东西: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
# 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