Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.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 on rails 解释Ruby代码_Ruby On Rails_Syntax - Fatal编程技术网

Ruby on rails 解释Ruby代码

Ruby on rails 解释Ruby代码,ruby-on-rails,syntax,Ruby On Rails,Syntax,我想知道以下代码在ruby中做了什么,以及是否可以在其他语言中做同样的事情 def func(a) $i ||= -1 eval %w(1 -1 3 6 1 1 -1 2 4 1)[$i+=1] end 如果我没有弄错的话,我知道$I引用了全局变量。但我不知道其余的是做什么的,以及如何在其他编程语言中做到这一点 $i ||= -1 这只是设置一个默认值。如果$i为零,它将$i设置为-1,否则$i将保持不变 eval %w(1 -1 3 6 1 1 -1 2 4 1)[$

我想知道以下代码在ruby中做了什么,以及是否可以在其他语言中做同样的事情

def func(a)
    $i ||= -1
    eval %w(1 -1 3 6 1 1 -1 2 4 1)[$i+=1]   
end
如果我没有弄错的话,我知道
$I
引用了全局变量。但我不知道其余的是做什么的,以及如何在其他编程语言中做到这一点

$i ||= -1
这只是设置一个默认值。如果
$i
为零,它将
$i
设置为-1,否则
$i
将保持不变

eval %w(1 -1 3 6 1 1 -1 2 4 1)[$i+=1] 
这里有几个部分

  • eval
    将在提供的字符串中计算Ruby表达式。因此,如果执行
    eval“5+5”
    ,Ruby将计算字符串并运行
    5+5
    ,返回
    10
  • %w
    是创建单词数组的Ruby快捷方式。它将根据给定的值创建一个字符串数组<代码>%w(测试此)将返回
    [“测试”,“此”]
  • [$i+=1]
    正在访问由
    %w
    创建的数组<将计算代码>$i+=1,将1添加到
    $1
    ,然后访问数组中的该元素。如果我们有
    $i=-1
    并执行
    [“测试”,“此”][$i+=1]
    ,我们将返回
    “测试”
    $i
    将变为0,因此我们基本上做了
    [“测试”,“这个”][0]
    ,第0个元素是“测试”
总之,如果$i为nil,该函数将返回数组中的第一个元素,或者只返回数组中的下一个元素
[“1”、“1”、“3”、“6”、“1”、“1”、“1”、“1”、“1”、“1”、“2”、“4”、“1”]

您可以在任何编程语言中轻松地执行此操作,只需从数组返回i+1元素

更新1 因此,要在Python中实现这一点:

i = None
def func(a):
    global i
    if i==None:
        i = -1
    i = i + 1
    return ["1", "-1", "3", "6", "1", "1", "-1", "2", "4", "1"][i]
更新2
Ruby
中,使用
$
设置和访问全局变量,在Python中,必须在函数中将全局变量声明为
global
。全局变量是危险的,所以Ruby和Python确保您的意思是访问全局变量

更新3 我在第一次更新中添加了
I=None
,需要定义全局变量

更新4 如果按原样执行更新1中的代码,它将继续将
i
重置为
None
,您需要再次运行
func(a)
,以返回下一个元素

>>> i = None
>>> func('test')
'1'
>>> func('test')
'-1'
>>> func('test')
'3'
>>> func('test')
'6'
>>> func('test')
'1'
这只是设置一个默认值。如果
$i
为零,它将
$i
设置为-1,否则
$i
将保持不变

eval %w(1 -1 3 6 1 1 -1 2 4 1)[$i+=1] 
这里有几个部分

  • eval
    将在提供的字符串中计算Ruby表达式。因此,如果执行
    eval“5+5”
    ,Ruby将计算字符串并运行
    5+5
    ,返回
    10
  • %w
    是创建单词数组的Ruby快捷方式。它将根据给定的值创建一个字符串数组<代码>%w(测试此)将返回
    [“测试”,“此”]
  • [$i+=1]
    正在访问由
    %w
    创建的数组<将计算代码>$i+=1,将1添加到
    $1
    ,然后访问数组中的该元素。如果我们有
    $i=-1
    并执行
    [“测试”,“此”][$i+=1]
    ,我们将返回
    “测试”
    $i
    将变为0,因此我们基本上做了
    [“测试”,“这个”][0]
    ,第0个元素是“测试”
总之,如果$i为nil,该函数将返回数组中的第一个元素,或者只返回数组中的下一个元素
[“1”、“1”、“3”、“6”、“1”、“1”、“1”、“1”、“1”、“1”、“2”、“4”、“1”]

您可以在任何编程语言中轻松地执行此操作,只需从数组返回i+1元素

更新1 因此,要在Python中实现这一点:

i = None
def func(a):
    global i
    if i==None:
        i = -1
    i = i + 1
    return ["1", "-1", "3", "6", "1", "1", "-1", "2", "4", "1"][i]
更新2
Ruby
中,使用
$
设置和访问全局变量,在Python中,必须在函数中将全局变量声明为
global
。全局变量是危险的,所以Ruby和Python确保您的意思是访问全局变量

更新3 我在第一次更新中添加了
I=None
,需要定义全局变量

更新4 如果按原样执行更新1中的代码,它将继续将
i
重置为
None
,您需要再次运行
func(a)
,以返回下一个元素

>>> i = None
>>> func('test')
'1'
>>> func('test')
'-1'
>>> func('test')
'3'
>>> func('test')
'6'
>>> func('test')
'1'

还有,为什么我们不能说i | |=-1?这会给我一个错误“全局名称‘i’未定义”,但是python代码只返回第一个元素。第一次调用它时!Ruby代码也将返回第一个元素。再次调用该函数,然后它将返回第二个元素,以此类推,forthI为您添加了另一个更新@user120931,如果你原来的问题已经得到了回答,如果你能接受我的回答那就太好了!还有,为什么我们不能说i | |=-1?这会给我一个错误“全局名称‘i’未定义”,但是python代码只返回第一个元素。第一次调用它时!Ruby代码也将返回第一个元素。再次调用该函数,然后它将返回第二个元素,以此类推,forthI为您添加了另一个更新@user120931,如果你原来的问题已经得到了回答,如果你能接受我的回答那就太好了!