Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 尝试创建一个从同一类中选择随机方法的方法_Ruby_Oop_Methods - Fatal编程技术网

Ruby 尝试创建一个从同一类中选择随机方法的方法

Ruby 尝试创建一个从同一类中选择随机方法的方法,ruby,oop,methods,Ruby,Oop,Methods,也许这是个愚蠢的想法。。。我是Ruby新手(也是OOP新手,所以大部分时间我都不知道自己在做什么),我想到了一个小而有趣的项目来构建,我正在为一些概念而挣扎 我正在构建的基本上是一个字符串操纵器。我正在用额外的方法构建一个模块,然后将其包含在String类中 我的模块有几种方法,它们以不同的方式处理字符串,主要是替换单词,然后返回修改后的字符串 为了使字符串操作更加“自发”和自然,我想做的是创建一个“main”方法(我将从字符串中调用该方法),该方法随机选择一个字符串操作方法,然后返回字符串(然

也许这是个愚蠢的想法。。。我是Ruby新手(也是OOP新手,所以大部分时间我都不知道自己在做什么),我想到了一个小而有趣的项目来构建,我正在为一些概念而挣扎

我正在构建的基本上是一个字符串操纵器。我正在用额外的方法构建一个模块,然后将其包含在String类中

我的模块有几种方法,它们以不同的方式处理字符串,主要是替换单词,然后返回修改后的字符串

为了使字符串操作更加“自发”和自然,我想做的是创建一个“main”方法(我将从字符串中调用该方法),该方法随机选择一个字符串操作方法,然后返回字符串(然后可以再次调用以一次应用多个操作)

我怎样才能做到这一点,或类似的事情?希望我能解释清楚

谢谢


O.

这是您描述的随机操作模块<代码>随机的东西是主要的方法:

将其混合到
字符串中

class String
  include RandomStringManipulation
end
现在我们可以创建一个空字符串,然后对它执行几次随机操作,每次都将其打印出来:

s = ""
4.times do
  s = s.something_random
  p s
end

# => "foo"
# => "foobar"
# => "foobarbar"
# => "foobarbarfoo"

有两个方面很有趣。第一个是:

methods -= [:something_random]
send methods.sample
从数组
方法中删除
:something\u random
,防止*something\u random*方法调用自身。第二个有趣的地方是:

methods -= [:something_random]
send methods.sample
Array.sample
(Ruby>=1.9)选择一个随机方法<代码>发送
然后发送该方法。在Ruby 1.8中,改为执行以下操作:

send methods[rand(methods.size)]

如果所有将使用您的功能的代码都是您的代码,我将创建一个新类,而不是猴子修补字符串。猴子补丁导致代码更难理解和共享

无论如何,给定一个mutator方法列表,您可以轻松地随机选择一个并使用Object#send调用它:

module StringMutator
   def fold() ... end
   def spindle() ... end
   def mutilate() ... end
end

class NiftyString
  include StringMutator
  def random_change() 
    im = StringMutator.instance_methods
    self.send im[rand im.length]
  end
end

谢谢,韦恩,这很有用。你的回答对我很有用,但我不得不接受这两个答案中的一个,马克的答案更容易理解,但你的答案让我学到了一些新东西。谢谢你才意识到,另一个代码不起作用,我不得不使用你的代码,所以我更改了接受的代码answer@0al0,我很高兴它对你有用。马克·里德(MarkReed)的回答中有一部分比我刚才写的任何东西都要好:他告诫你们要提防猴子修补绳子。这是个好建议。这里有陷阱:想象一下,一些宝石也在修补绳子。当你的猴子补丁和别人的冲突时,你会希望自己永远不会出生。这可能是一个真正的痛苦。我知道,我读过,但这是一个非常小的项目,我做的乐趣,不打算重复使用它或任何东西,所以它不应该是一个问题