【问题标题】:New to Ruby - how do I shuffle a string?Ruby 新手 - 如何随机播放字符串?
【发布时间】:2011-10-23 20:50:05
【问题描述】:

想要随机播放一个字符串。 这是我的代码: 它有什么问题? 谢谢。

>> def string_shuffle(s)
>>   s.split('').shuffle(s.length()).join
>>   return s
>> end

【问题讨论】:

    标签: ruby


    【解决方案1】:

    如果你理解正确,你想要这个:

    def string_shuffle(s)
      s.split("").shuffle.join
    end
    
    string_shuffle("The Ruby language")
    => "ea gu bgTayehRlnu"
    

    【讨论】:

    • 如果您需要大量改组,使用shuffle! 而不是shuffle 是有意义的。它有点快。
    • 你可以用chars代替split("")
    【解决方案2】:

    return s 既不需要也错误。不需要,因为 Ruby 返回最后执行的任何内容,并且错误因为您没有更改 s,而是创建了一个新字符串。

    此外,如果你觉得 shuffle 方法有用,你可以直接将它添加到 String 中,但要注意猴子补丁太多。

    class String
    
      def shuffle
        self.split('').shuffle.join
      end
    end
    

    【讨论】:

    • 你可以把它放在一个模块中,然后将该模块应用到你想要影响的字符串,这样它就不会影响应用程序中的其他字符串并造成不必要的影响。
    • @Joseph,如何让模块影响特定的字符串实例?一个例子或链接会很棒。另外,乔希,您可能会发现这个question about monkeypatching 很有用。
    • @Zabba ruby-doc.org/core/classes/Module.html 检查扩展。它猴子修补一个变量而不是一个类。
    • 此外,探索包含模块和扩展模块之间的区别。一种常见的模式是使用模块中的 self.included 方法来扩展另一个,因此它包含一些类方法。
    【解决方案3】:

    这样更快。 'hello'.chars.shuffle.join

    测试自己:

    require 'benchmark'
    
    str = 'Hello' * 100
    Benchmark.bm(10) do |x|
      x.report('chars')       { str.chars.shuffle.join }
      x.report('split')       { str.split('').shuffle.join }
      x.report('split regex') { str.split(//).shuffle.join }
    end
    

    【讨论】:

      【解决方案4】:

      shuffle 不接受(并且需要)参数。使用:

       s.split(//).shuffle.to_s
      

      【讨论】:

        【解决方案5】:

        试试这个

        s.split('').shuffle.join
        

        【讨论】:

          【解决方案6】:

          这样就可以了:

          s.chars.shuffle.join
          

          例子:

          s = "Hello, World!"
          puts s.chars.shuffle.join
          

          输出:

          olH!l rWdel,o
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-04-11
            • 2016-04-28
            • 2012-08-05
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多