基本上我有两个模块:CoreExtensions::CamelcasedJsonString
和…::CamelcasedJsonSymbol
。后者覆盖Symbol#to_s
,以便该方法返回一个String
,该扩展名为第一个模块。我不希望每个字符串都是CamelcasedJsonString
。这就是我尝试应用特定扩展实例的原因。带模块的红宝石核心扩展
我的问题是,Symbol#to_s
看来以后我包括我的模块(最后的规范失败)再次被改写:
require 'rubygems' if RUBY_VERSION < '1.9'
require 'spec'
module CoreExtensions
module CamelcasedJsonString; end
module CamelcasedJsonSymbol
alias to_s_before_core_extension to_s
def to_s(*args)
to_s_before_core_extension(*args).extend(CamelcasedJsonString)
end
end
::Symbol.send :include, CamelcasedJsonSymbol
end
describe Symbol do
subject { :chunky_bacon }
it "should be a CamelcasedJsonSymbol" do
subject.should be_a(CoreExtensions::CamelcasedJsonSymbol)
end
it "should respond to #to_s_before_core_extension" do
subject.should respond_to(:to_s_before_core_extension)
end
specify "#to_s should return a CamelcasedJsonString" do
subject.to_s.should be_a(CoreExtensions::CamelcasedJsonString)
end
end
然而,下面的示例:
require 'rubygems' if RUBY_VERSION < '1.9'
require 'spec'
module CoreExtensions
module CamelcasedJsonString; end
end
class Symbol
alias to_s_before_core_extension to_s
def to_s(*args)
to_s_before_core_extension(*args).extend(CoreExtensions::CamelcasedJsonString)
end
end
describe Symbol do
subject { :chunky_bacon }
it "should respond to #to_s_before_core_extension" do
subject.should respond_to(:to_s_before_core_extension)
end
specify "#to_s should return a CamelcasedJsonString" do
subject.to_s.should be_a(CoreExtensions::CamelcasedJsonString)
end
end
更新:2010年1月24日
我的问题的背景是,我尝试将巨大的嵌套散列 结构转换为JSON字符串。这个散列表中的每个键都是 中的典型下划线表示法中的Ruby Symbol
。使用JSON 数据的JavaScript库期望这些密钥是camelcase符号中的字符串。我认为重写Symbol#to_json
方法可能是最简单的方法。但是 没有解决问题,因为Hash#to_json
在每个密钥上首先调用#to_s
和之后的 #to_json
。所以我觉得这可能是一个解决方案来扩展 通过Symbol#to_s
与覆盖该特定字符串实例的 #to_json
方法返回拥有 一个#to_json
方法,它返回自己在驼峰表示法的字符串模块returnd所有字符串。
我不确定是否有简单的方法来猴子补丁Hash#to_json
。
如果有人想看看到我使用JSON实现,这里是链接:http://github.com/flori/json/blob/master/lib/json/pure/generator.rb(线239和下面是利息)
我有一个巨大的嵌套散列结构。每个键都是下划线符号的红宝石符号。我尝试将每个符号转换为camelcase符号中的字符串,因为使用JSON数据的JavaScript库期望在此符号中使用键。我认为我的方法可能比遍历整个散列更快。 例如:{:chunky_bacon =>“某个值”} .to_json应该像'{“chunkyBacon”:“某个值”}' – t6d 2010-01-23 15:08:05
感谢您的澄清。不要犹豫,相应地修改你的问题。查看我的更新回答 – 2010-01-23 19:06:14
到目前为止,非常感谢您的帮助。我更新了我的问题。问题是Hash#to_json不会调用某事物。如符号#to_json,而不是符号#to_s#to_json。如果有一个简单的方法来修补Hash#to_json补丁,我真的不会。 – t6d 2010-01-24 11:48:38