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 - Fatal编程技术网

使用Ruby解决测验

使用Ruby解决测验,ruby,Ruby,所以我在一个网站上发现了这个小测验,我很高兴能用我新学到的Ruby技能(CodeAcademy,还没完成)解决它 我要做的是创建一个包含100个条目的数组,所有条目都设置为“打开”。然后,我计划创建一个方法,该方法包含一个for循环,循环遍历数组的每n个条目,并根据之前的情况将其更改为“打开”或“关闭”。在for循环中,n应该从1增加到100 到目前为止,我得到的是: change_state = Proc.new { |element| element == "open" ? element

所以我在一个网站上发现了这个小测验,我很高兴能用我新学到的Ruby技能(CodeAcademy,还没完成)解决它

我要做的是创建一个包含100个条目的数组,所有条目都设置为“打开”。然后,我计划创建一个方法,该方法包含一个for循环,循环遍历数组的每n个条目,并根据之前的情况将其更改为“打开”或“关闭”。在for循环中,n应该从1增加到100

到目前为止,我得到的是:

change_state = Proc.new { |element| element == "open" ? element = "closed" : element = "open" }

def janitor(array,n)
    for i in 1..n
        array.each { |element| if array.index(element) % i == 0 then element.change_state end }
    end
end

lockers = [*1..100]

lockers = lockers.map{ |element| element = "closed" }

result = janitor(lockers,100)
在尝试执行时,我收到一个错误,上面写着:

undefined method `change_state' for "closed":String (NoMethodError)
有人知道这里怎么了吗?我有点认为我在当前数组元素上错误地调用了“change\u state”过程


如果你知道这个测验,请不要捣乱

正如您已经实现的
change\u state
一样,它不是任何类的方法,也肯定不是附加到数组中任何单个元素的方法,尽管您使用的变量名是相同的
element
。因此,您不能将其称为
元素。请更改\u state

相反,它是一个指向
Proc
对象的变量

要调用
Proc
对象中的代码,可以使用
call
方法,以及
Proc\u obj.call(params)
-在您的例子中
change\u state.call(元素)

如果您只是插入该更改,您的错误消息将更改为:

NameError: undefined local variable or method `change_state' for main:Object
这是因为
change\u state
变量不在方法的作用域内,因此无法调用。有很多方法可以使它可用。一种选择是将其作为参数传入,这样您对看门人的定义就变为

 def janitor(array,n,state_proc)
(在例程中使用变量名
state\u proc
,而不是
change\u state
——我建议您更改名称以避免混淆自己)

你可以这样称呼它:

result = janitor(lockers,100,change_state)
虽然您的示例并不真正需要这种结构,但这是Ruby代码提供通用“外部”函数的一种方式,例如,通过数组元素工作,并让代码的用户提供一个小型的内部自定义部分。实现与您的示例相同结果的一种更常见的方法是使用Ruby块和
yield
方法,但是
Proc
也有它们的用途,因为您可以将它们视为数据和代码-因此您可以将它们传递,将它们放入哈希或数组中,以决定调用哪一个等等


代码中可能还有其他问题需要解决,但这是问题中出现错误消息的原因。

由于您已经实现了
change\u state
,它不是任何类的方法,当然也不是附加到数组中任何单个元素的方法,尽管您使用了相同的变量名
element
。因此,您不能将其称为
元素。请更改\u state

相反,它是一个指向
Proc
对象的变量

要调用
Proc
对象中的代码,可以使用
call
方法,以及
Proc\u obj.call(params)
-在您的例子中
change\u state.call(元素)

如果您只是插入该更改,您的错误消息将更改为:

NameError: undefined local variable or method `change_state' for main:Object
这是因为
change\u state
变量不在方法的作用域内,因此无法调用。有很多方法可以使它可用。一种选择是将其作为参数传入,这样您对看门人的定义就变为

 def janitor(array,n,state_proc)
(在例程中使用变量名
state\u proc
,而不是
change\u state
——我建议您更改名称以避免混淆自己)

你可以这样称呼它:

result = janitor(lockers,100,change_state)
虽然您的示例并不真正需要这种结构,但这是Ruby代码提供通用“外部”函数的一种方式,例如,通过数组元素工作,并让代码的用户提供一个小型的内部自定义部分。实现与您的示例相同结果的一种更常见的方法是使用Ruby块和
yield
方法,但是
Proc
也有它们的用途,因为您可以将它们视为数据和代码-因此您可以将它们传递,将它们放入哈希或数组中,以决定调用哪一个等等


代码中可能还有其他问题需要解决,但这是问题中出现错误消息的原因。

由于您已经实现了
change\u state
,它不是任何类的方法,当然也不是附加到数组中任何单个元素的方法,尽管您使用了相同的变量名
element
。因此,您不能将其称为
元素。请更改\u state

相反,它是一个指向
Proc
对象的变量

要调用
Proc
对象中的代码,可以使用
call
方法,以及
Proc\u obj.call(params)
-在您的例子中
change\u state.call(元素)

如果您只是插入该更改,您的错误消息将更改为:

NameError: undefined local variable or method `change_state' for main:Object
这是因为
change\u state
变量不在方法的作用域内,因此无法调用。有很多方法可以使它可用。一种选择是将其作为参数传入,这样您对看门人的定义就变为

 def janitor(array,n,state_proc)
(在例程中使用变量名
state\u proc
,而不是
change\u state
——我建议您更改名称以避免混淆自己)

你可以这样称呼它:

result = janitor(lockers,100,change_state)
虽然您的示例并不真正需要这种结构,但这是Ruby代码提供通用“外部”函数的一种方式,例如,通过数组元素工作,并让代码的用户提供一个小型的内部自定义部分。实现与示例相同结果的更常见方法是使用Ruby块和
yield
方法,但是
Proc
s也有其用途,因为您可以将它们视为数据和代码