标签: ruby

为什么我们需要纤维

对于Fibers,我们有一个典型的例子:生成Fibonacci数

fib = Fiber.new do  
  x, y = 0, 1 
  loop do  
    Fiber.yield y 
    x,y = y,x+y 
  end 
end
Run Code Online (Sandbox Code Playgroud)

为什么我们需要光纤呢?我可以用相同的Proc重写这个(实际上是闭包)

def clsr
  x, y = 0, 1
  Proc.new do
    x, y = y, x + y
    x
  end
end
Run Code Online (Sandbox Code Playgroud)

所以

10.times { puts fib.resume }
Run Code Online (Sandbox Code Playgroud)

prc = clsr 
10.times { puts prc.call }
Run Code Online (Sandbox Code Playgroud)

将返回相同的结果.

那么纤维有什么优点呢?我可以用Fibers写什么样的东西我不能用lambdas和其他很酷的Ruby功能?

ruby lambda closures fibers proc

95
推荐指数
2
解决办法
2万
查看次数

如何在Rails环境中运行Ruby文件?

我想在Rails环境的上下文中运行Ruby文件.rails runner几乎可以做我想做的事,但我想给它一个文件名和参数.我很确定这是可能的,因为我以前做过.有人能提醒我怎么做吗?

ruby ruby-on-rails ruby-on-rails-3

95
推荐指数
4
解决办法
5万
查看次数

rails form_for标签的自定义文本

我想在以下位置显示标签form_for:

<div class="field">
  <%= f.label :name %><br />
  <%= f.text_field :name %>
</div>
Run Code Online (Sandbox Code Playgroud)

这会生成标签"Name",但我希望它是"你的名字".我该怎么改变它?

ruby ruby-on-rails form-for ruby-on-rails-3.2

95
推荐指数
2
解决办法
6万
查看次数

如何在Ruby中获取经过的时间(以毫秒为单位)?

如果我有一个Time对象来自:

Time.now
Run Code Online (Sandbox Code Playgroud)

然后我用同一行实例化另一个对象,我怎么能看到已经过了多少毫秒?第二个对象可以在接下来的几分钟甚至几小时内创建相同的分钟.

ruby

94
推荐指数
9
解决办法
11万
查看次数

如何使用Active Support核心扩展?

我安装了Active Support 3.0.3,使用Ruby 1.8.7安装了Rails 3.0.3.

当我尝试使用时,1.week.ago我得到了

NoMethodError: undefined method 'week' for 1:Fixnum
from (irb):2
Run Code Online (Sandbox Code Playgroud)

其他核心扩展似乎有效.我在一个朋友的计算机上尝试过(同样的安装规范和旧版本),结果相同.

是什么赋予了?

所有这些都在IRB中.

ruby time extension-methods ruby-on-rails activesupport

94
推荐指数
2
解决办法
5万
查看次数

什么是Ruby中的java接口等价物?

我们可以像在java中那样公开Ruby中的接口,并强制执行Ruby模块或类来实现接口定义的方法.

一种方法是使用继承和method_missing来实现相同的目标,但还有其他更合适的方法吗?

ruby interface

94
推荐指数
6
解决办法
5万
查看次数

如何根据名称动态调用方法?

当名称包含在字符串变量中时,如何动态调用方法?例如:

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)

我怎样才能做到这一点?这样做是否存在安全风险?

ruby metaprogramming dynamic

94
推荐指数
5
解决办法
7万
查看次数

在ruby中设置DateTime的时间部分

假设我有一个日期时间对象,例如DateTime.now.我想将小时和分钟设置为0(午夜).我怎样才能做到这一点?

ruby datetime

94
推荐指数
3
解决办法
6万
查看次数

删除String中的多个空格和新行

假设我们有这样的字符串:

Hello, my\n       name is Michael.
Run Code Online (Sandbox Code Playgroud)

如何删除该新行并将其后的那些空格删除到字符串内部以获取此内容?

Hello, my name is Michael.
Run Code Online (Sandbox Code Playgroud)

ruby string

94
推荐指数
6
解决办法
6万
查看次数

Ruby自定义错误类:message属性的继承

我似乎无法找到有关自定义异常类的更多信息.

我所知道的

您可以声明自定义错误类并让它继承StandardError,因此它可以是rescued:

class MyCustomError < StandardError
end
Run Code Online (Sandbox Code Playgroud)

这允许您使用以下方法来提高它:

raise MyCustomError, "A message"
Run Code Online (Sandbox Code Playgroud)

然后,在救援时获取该消息

rescue MyCustomError => e
  puts e.message # => "A message"
Run Code Online (Sandbox Code Playgroud)

我不知道的

我想给我的异常一些自定义字段,但我想message从父类继承该属性.我发现阅读关于这个主题@message不是异常类的实例变量,所以我很担心我的遗产将无法正常工作.

谁能给我更多细节呢?如何使用object属性实现自定义错误类?以下是正确的:

class MyCustomError < StandardError
  attr_reader :object
  def initialize(message, object)
    super(message)
    @object = object
  end
end
Run Code Online (Sandbox Code Playgroud)

然后:

raise MyCustomError.new(anObject), "A message"
Run Code Online (Sandbox Code Playgroud)

要得到:

rescue MyCustomError => e
  puts e.message # => "A message"
  puts e.object # => anObject
Run Code Online (Sandbox Code Playgroud)

它会起作用,如果确实如此,这是正确的做事方式吗?

ruby inheritance exception-handling exception custom-exceptions

94
推荐指数
4
解决办法
6万
查看次数