这是一些简单的代码,对于指定的每个参数,将添加以该参数命名的特定get/set方法.如果你写attr_option :foo, :bar,那么你将看到#foo/foo=和#bar/bar=实例方法Config:
module Configurator
class Config
def initialize()
@options = {}
end
def self.attr_option(*args)
args.each do |a|
if not self.method_defined?(a)
define_method "#{a}" do
@options[:"#{a}"] ||= {}
end
define_method "#{a}=" do |v|
@options[:"#{a}"] = v
end
else
throw Exception.new("already have attr_option for #{a}")
end
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.我想写一些RSpec测试来验证这段代码实际上正在做它应该做的事情.但是有一个问题!如果我attr_option :foo在其中一个测试方法中调用,那么现在在Config中永远定义了该方法.因此,后续测试将失败,因为foo已经定义:
it "should support a specified option" do
c = Configurator::Config
c.attr_option :foo
# ...
end
it "should support …Run Code Online (Sandbox Code Playgroud) 我有两个小的结构问题,我不确定如何处理,因为我与RoR的相对新手.
第一个问题:在我的一个观点中,我的代码如下所示:
<ul style="list-style-type: circle">
<li><%= @apples.size %> apples</li>
<li><%= @oranges.size %> oranges</li>
<li><%= @bananas.size %> bananas</li>
<li><%= @grapefruits.size %> grapefruits</li>
</ul>
Run Code Online (Sandbox Code Playgroud)
是否有可能重构这一点,以便我只需要在一些不同种类的水果列表上迭代一次,并<li>自动生成相应的水果?编辑:我忘了补充一点@apples,@oranges等等,可能是nil.是否有一种惯用的方法来处理它?
第二个问题:在我的控制器中,我的代码如下所示:
@apples = Apple.find(:all)
@apples.each { |apple| apple.do_stuff(:xyz) }
@bananas = Banana.find(:all)
@bananas.each = { |banana| banana.do_stuff(:xyz) }
# ... &c
Run Code Online (Sandbox Code Playgroud)
如您所见,以完全相同的方式多次调用相同的操作.有没有办法将此缩短为类似的东西[Apple.find(:all), ...].each { |fruit| ... },而是让它起作用?
非常感谢您的帮助!
考虑这个人为的例子:
# Dispatch on value of fruit_kind:
TYPE_A = :apple
TYPE_B = :banana
TYPE_C = :cherry
eating_method = nil
case fruit_kind
# Methods to use for different kinds of fruit (assume these are
# already defined)
when TYPE_A then eating_method = bite
when TYPE_B then eating_method = peel
when TYPE_C then eating_method = om_nom_nom
end
Run Code Online (Sandbox Code Playgroud)
现在我想eating_method用一些参数来调用目标:
# Doesn't work; this tries to invoke a method called "eating_method",
# not the reference I defined earlier.
eating_method(some_fruit)
Run Code Online (Sandbox Code Playgroud)
在Ruby中这样做的正确方法是什么?
我有一个数组数组,如下所示:
fruits_and_calories = [
["apple", 100],
["banana", 200],
["kumquat", 225],
["orange", 90]
]
Run Code Online (Sandbox Code Playgroud)
我还有一个我想在数组的每个元素上调用的方法:
fruits_and_calories.each do |f| eat(f[0], f[1])
Run Code Online (Sandbox Code Playgroud)
我真的希望能说出类似的话:
fruits_and_calories.each do |f| eat(f[:name], f[:calories])
Run Code Online (Sandbox Code Playgroud)
有没有办法可以在不必更改数组中的每个项目的情况下将其拉出来(例如,通过迭代它并以某种方式添加符号)?或者,如果这太难了,还有更好的选择吗?
我在内部网站上遇到了这个片段,但我无法理解它:
function safeWrap(f) {
return function() {
setTimeout.apply(window, [f, 0].concat([].slice.call(arguments)));
};
}
Run Code Online (Sandbox Code Playgroud)
后来,它使用如下:
// Set click handler.
(...).click(safeWrap(function() { ... } ));
Run Code Online (Sandbox Code Playgroud)
这意味着什么?
我有一个类Wrapper,它支持添加选项,然后您可以查找.它将这些选项存储在内部哈希中@dict.
w = Wrapper.new
w.foo # => NameError
w.foo = 10
w.foo # => 10
Run Code Online (Sandbox Code Playgroud)
如何编写method_missingfor Wrapper以便我可以支持嵌套调用@dict?
w = Wrapper.new
w.foo.bar.baz = 1000
w.foo.bar.baz # => 1000
Run Code Online (Sandbox Code Playgroud) 我在Ruby中有一个基本上代表方形布尔矩阵的数组.点表示零,而任何其他字符表示零.例:
irb(main):044:0> g
=> [".b", "m."] # This grid has two '1' values and two '0' values.
Run Code Online (Sandbox Code Playgroud)
我想在这个数组上使用另一个类似的数组执行指定的逻辑运算(比方说,OR)以获得第三个结果.例如,如果h是["q.", "r."],则类似的东西g.perform_or(h)应该产生一个新数组["qb", "r."].(r表示结果的选择'm' || 'r'是任意的,不相关;任何其他非'.'字符都可以存在.)
我怎么能这样做?
编辑:我在我的例子中犯了一个错误.道歉!