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