我不确定Ruby中C风格回调的最佳习惯用法是什么——或者是否有更好的习惯用法(而不像C).在C语言中,我会这样做:

void DoStuff( int parameter, CallbackPtr callback )
{
  // Do stuff
  ...
  // Notify we're done
  callback( status_code )
}

什么是好的Ruby类似功能?本质上,我想在"DoStuff"中满足某个条件时调用传入的类方法

推荐答案

ruby的类似功能(不是惯用语)是:

def my_callback(a, b, c, status_code)
  puts "did stuff with #{a}, #{b}, #{c} and got #{status_code}"
end

def do_stuff(a, b, c, callback)
  sum = a + b + c
  callback.call(a, b, c, sum)
end

def main
  a = 1
  b = 2
  c = 3
  do_stuff(a, b, c, method(:my_callback))
end

惯用的方法是传递一个块,而不是对一个方法的引用.与独立方法相比,块的一个优点是上下文——块是closure,因此它可以引用声明它的范围中的变量.这减少了do_stuff需要传递给回调的参数数量.例如:

def do_stuff(a, b, c, &block)
  sum = a + b + c
  yield sum
end

def main
  a = 1
  b = 2
  c = 3
  do_stuff(a, b, c) { |status_code|
    puts "did stuff with #{a}, #{b}, #{c} and got #{status_code}"
  }
end

Ruby相关问答推荐

如何在 Ruby 中正确编写代码?以便它产生正确的输出?

令人惊讶的有效 Ruby 语法:% 无处不在

while 语句的主体是块吗?

在Ruby中将嵌套哈希键从CamelCase转换为snake_case

如果 Java 人go Scala,C# go F#,那么 Ruby 人go 哪里寻求函数式?

Nokogiri/Xpath 命名空间查询

在 gem 中放置/访问配置文件的位置?

如何期望 RSpec should_receive 的一些(但不是全部)参数?

扩展self 和module_function一样吗?

Sinatra 是多线程的吗?

什么是匹配不在行尾的字符串的正则表达式?

升级到 Rubygems 1.5.0 后,Bundler 抛出未初始化的常量 Gem::SilentUI (NameError) 错误

从命令行使用Bundle 器将 gem 添加到 gemfile

如何在不等式中使用Ruby case ... when?

Ruby CSV - 获取当前行/行号

Mustache Templates 可以做模板扩展吗?

在 Ruby 中查找内存泄漏的原因

Ruby 中的超级关键字

Array.empty 的相反方法是什么?或 [].empty?在Ruby中

Ruby:如何在不指向同一个对象的情况下复制变量?