小编Kyl*_*tan的帖子

如何编写RSpec测试来对这个有趣的元编程代码进行单元测试?

这是一些简单的代码,对于指定的每个参数,将添加以该参数命名的特定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)

ruby testing rspec metaprogramming

2
推荐指数
1
解决办法
1120
查看次数

如何折叠这个非常重复的Ruby/Rails代码?

我有两个小的结构问题,我不确定如何处理,因为我与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| ... },而是让它起作用?

非常感谢您的帮助!

ruby ruby-on-rails

1
推荐指数
1
解决办法
242
查看次数

Ruby:如何通过对象引用调用函数?

考虑这个人为的例子:

# 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中这样做的正确方法是什么?

ruby idioms method-dispatch

1
推荐指数
1
解决办法
1665
查看次数

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)

有没有办法可以在不必更改数组中的每个项目的情况下将其拉出来(例如,通过迭代它并以某种方式添加符号)?或者,如果这太难了,还有更好的选择吗?

ruby arrays idioms

1
推荐指数
2
解决办法
2611
查看次数

这个Javascript代码有什么作用?

我在内部网站上遇到了这个片段,但我无法理解它:

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)

这意味着什么?

javascript

1
推荐指数
1
解决办法
248
查看次数

我怎么写这个`method_missing`?

我有一个类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 metaprogramming

1
推荐指数
1
解决办法
438
查看次数

Ruby中字符串数组的布尔比较

我在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'是任意的,不相关;任何其他非'.'字符都可以存在.)

我怎么能这样做?


编辑:我在我的例子中犯了一个错误.道歉!

ruby

0
推荐指数
1
解决办法
466
查看次数