当名称包含在字符串变量中时,如何动态调用方法?例如:
class MyClass
def foo; end
def bar; end
end
obj = MyClass.new
str = get_data_from_user # e.g. `gets`, `params`, DB access, etc.
str #=> "foo"
# somehow call `foo` on `obj` using the value in `str`.
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?这样做是否存在安全风险?
" 'eval'应该是令人讨厌的吗? "启发了这个:
大多数人都认为这eval很糟糕,并且在大多数情况下更优雅/更安全.
所以我想问:如果eval经常误用,是否真的需要作为语言功能?这是邪恶而不是好吗?
就个人而言,我发现它唯一有用的地方是插入配置文件中提供的字符串.
编辑:这个问题的目的是在eval是唯一或最佳解决方案时尽可能多地获得真实案例.所以,请不要进入"应该用语言限制程序员的创造力"的方向.
编辑2:当我说eval,当然我指的是eval字符串,而不是将红宝石块传递给instance_eval或class_eval.
我正在用Ruby编写内部DSL.为此,我需要以编程方式创建命名类和嵌套类.这样做的最佳方法是什么?我认为有两种方法可以做到这一点:
Class.new创建一个匿名类,然后使用define_method的方法添加到它,最后调用const_set将其添加为命名常量一些命名空间.eval我已经测试了第一种方式并且它有效,但是对Ruby来说是新手,我不确定将类作为常量是正确的方法.
还有其他更好的方法吗?如果没有,上述哪一项更可取?
我不明白class_eval.
class Module
def attr_ (*syms)
syms.each do |sym|
class_eval %{def #{sym}= (val)
@#{sym} = val
end}
end
end
end
Run Code Online (Sandbox Code Playgroud)
什么%意思?
怎么class_eval办?
哪里(val)来了?
例如,我正在从cli上传递的参数中动态定义模块名称 Required::Module::#{ARGV.first}
有没有办法检查该模块是否存在?另外,我怎么会在它上面运行方法而不知道它的确切名称?
我有一个本地变量名称作为字符串,需要获取其值.
variable = 22
"variable".to_variable?
Run Code Online (Sandbox Code Playgroud)
如何22从字符串中获取值?
如何将字符串转换为 ActiveSupport::Duration?
在 Rails 控制台中,此代码有效
Date.today + 1.month (or 22.days)
Run Code Online (Sandbox Code Playgroud)
但这不起作用
Date.today + '1.month'
Run Code Online (Sandbox Code Playgroud)
它说类型错误:预期数字
“1.month”来自数据库记录。
我想访问像哈希对象的json字符串,以便我可以使用键值来访问json temp["anykey"].如何将ruby格式的json字符串转换为json对象?
我有以下json字符串
temp = '{"accept"=>"*/*", "host"=>"localhost:4567", "version"=>"HTTP/1.1",
"user_agent"=>"curl/7.22.0 (x86_64-pc-linux-gnu) libcurl/7.22.0 OpenSSL/1.0.1 zlib/1.2.3.4 libidn/1.23 librtmp/2.3",
"http_token"=>"375fe428b1d32787864264b830c54b97"}'
Run Code Online (Sandbox Code Playgroud) 我有这个字符串,我需要转换为哈希:
str = '{:gender=>{:content=>"male"}, :names=>[{:first=>"Atair", :last=>"Goron"}], :addresses=>[{:country=>"GB", :state=>"ENG", :city=>"London"}], :emails=>[{:address=>"agoron@keolis.com", :address_md5=>"971b2fd0b83c900a5ca62c91dab80dd9"}, {:address=>"atair.godon.75@facebook.com", :address_md5=>"a0d958c1396300a344356d57b6836f9e"}], :jobs=>[{:title=>"Chief Executive Officer", :organization=>"Kolis UK and Eire"}, {:title=>"Deputy Managing Director", :organization=>"Kolis UK", :date_range=>{:start=>"2008-04-01", :end=>"2010-04-01"}}, {:title=>"Project Director", :organization=>"Keolis UK", :date_range=>{:start=>"2004-04-01", :end=>"2008-04-01"}}, {:title=>"Strategic Planning Director", :organization=>"Eurostar", :date_range=>{:start=>"2002-04-01", :end=>"2004-04-01"}}, {:title=>"Commercial Director, Business Markets", :organization=>"Eurostar", :date_range=>{:start=>"1999-11-01", :end=>"2002-04-01"}}, {:title=>"Brand Manager", :organization=>"Eurostar", :date_range=>{:start=>"1998-06-01", :end=>"1999-11-01"}}, {:title=>"Business Forecasting Manager", :organization=>"Eurostar", :date_range=>{:start=>"1997-08-01", :end=>"1998-06-01"}}, {:title=>"Principal Consultant", :organization=>"Steer Davies Gleave", :date_range=>{:start=>"1995-04-01", :end=>"1997-08-01"}}, {:title=>"Transport Consultant", :organization=>"Sir Alexander Gibb and Part", :date_range=>{:start=>"1990-01-01", :end=>"1995-12-31"}}], :educations=>[{:school=>"U. of London"}, {:school=>"University College London, U. …Run Code Online (Sandbox Code Playgroud)