ruby - 将自定义方法从自定义类传递到 .map

标签 ruby proc

我正在为 exercism.io 进行练习 - 说明很长并且与这个问题无关,但您可以找到我的完整解决方案 here .

基本上我有一个 Robot 类和 3 个私有(private)方法:

  def rand_letters
    ('A'..'Z').to_a[rand(26)]
  end

  def rand_numbers
    (0..9).to_a[rand(10)]
  end

我想做的是将它们传递给另一个私有(private)方法,如下所示:

  def set_name
    @name = ((1..2).map(&:rand_letters) + (3..5).map(&:rand_numbers)).join
  end

当我这样做时,我收到错误:1:Fixnum 的未定义方法“rand_letters”。看完this question我想问题可能是我的类没有 to_proc 方法。不幸的是我不知道如何纠正这个问题。我尝试让我的类继承 Proc 但我一直不知道如何重写 to_proc。任何帮助我指明正确方向的帮助将不胜感激。

最佳答案

首先:您可以使用 array.sample 而不是 array[rand(x)] 从数组中获取随机元素。

此外,您可以将 (1..n).map 替换为 n.times.map:

(2.times.map { rand_letters } + 3.times.map { rand_numbers }).join

但是使用map对我来说感觉违反直觉。如果我们可以简单地抓取 3 个随机字母,不是更容易吗?

这可以通过返回 Enumerator 来实现而不是单个值。复数命名已经表明 rand_ 方法应该返回多个值:

def rand_letters
  return enum_for(__method__) unless block_given?
  loop { yield ('A'..'Z').to_a.sample }
end

def rand_numbers
  return enum_for(__method__) unless block_given?
  loop { yield (0..9).to_a.sample }
end

这使我们可以调用 Enumerable#take :

(rand_letters.take(2) + rand_numbers.take(3)).join
#=> "ZJ010"

或者使用[...]文字:

[rand_letters.take(2), rand_numbers.take(3)].join

关于ruby - 将自定义方法从自定义类传递到 .map,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31245577/

相关文章:

ruby - 导轨 3 : Loop shows more records than there should be

ruby - ruby-lang.org 上给出的 __FILE__ = $0 的含义

ruby-on-rails - belongs_to 关联栏中的组函数

oracle - 调用 Oracle 数据库函数时出现问题 ORA-22922 : nonexistent LOB value

linux - 从 procfile 中删除

ruby - 如何联合两个不同的 Mongoid Criteria

ruby-on-rails - Rails 3.x 中 CAS 服务器的设置问题

ruby-on-rails - 根据实例 eval 将实例变量传递给 DSL

c - 读取/proc/pid/mem 文件不返回任何内容

linux - 无法从 C linux 中的/proc 位置打开文件夹