初学者Ruby-关于对象

初学者Ruby-关于对象,ruby,Ruby,Ruby初学者在这里…下面是两个类似的代码,我了解这个非常基本的代码的过程,但我想了解它背后的理论 首先 第二 def stats(ppg) if ppg > 20 "The PG is considered elite" else "The PG is not considered elite" end end puts stats(28) 因此,第一个片段自动写出字符串,而第二个片段没有——第一个片段中的stats(ppg)被认为是一个对

Ruby初学者在这里…下面是两个类似的代码,我了解这个非常基本的代码的过程,但我想了解它背后的理论

首先

第二

 def stats(ppg)
   if ppg > 20
     "The PG is considered elite"
   else
     "The PG is not considered elite"
   end
 end

 puts stats(28)
因此,第一个片段自动写出字符串,而第二个片段没有——第一个片段中的stats(ppg)被认为是一个对象还是一个以变量作为参数的方法

def stats(ppg)
在这两种情况下都是一样的,即名为
stats
的方法的方法定义的开头,该方法使用一个参数,该参数将在方法体中命名为
ppg

stats(28)
在这两种情况下都是一样的,即调用名为
stats
的方法,并将文本Fixnum
28
作为其参数传递,然后将其从定义分配给方法体内部的变量
ppg

在Ruby中,每个表达式都涉及两种不同的现象:副作用和返回值。表达式
a=1
的副作用是将
1
的值赋给变量
a
,返回值为
1
。并非Ruby中的每个方法都有副作用,但每个方法都有一个返回值——要么是显式返回值(通过使用
return
),要么是方法体中计算的最后一个表达式的返回值

put
在Ruby中是一个不幸的方法,因为它在很多初学者示例中都使用过,但它的行为令人困惑。它的副作用是将其参数打印到stdout,但其返回值是
nil
(这常常会让初学者感到困惑,他们希望它返回其参数的值)

第一个方法和第二个方法之间的区别在于,第一个方法由于在内部使用了
put
,因此会产生副作用,将字符串打印到stdout,返回值为
nil
,而第二个方法没有副作用,只是字符串本身的返回值

因此,当您调用第一个方法而不在前面放置
时,会出现打印字符串的副作用,您会看到输出。当调用第二个方法时,没有打印副作用,因此为了将字符串打印到stdout,必须调用
put
put
的参数是
stats
方法的返回值,即要打印的字符串

def stats(ppg)
在这两种情况下都是一样的,即名为
stats
的方法的方法定义的开头,该方法使用一个参数,该参数将在方法体中命名为
ppg

stats(28)
在这两种情况下都是一样的,即调用名为
stats
的方法,并将文本Fixnum
28
作为其参数传递,然后将其从定义分配给方法体内部的变量
ppg

在Ruby中,每个表达式都涉及两种不同的现象:副作用和返回值。表达式
a=1
的副作用是将
1
的值赋给变量
a
,返回值为
1
。并非Ruby中的每个方法都有副作用,但每个方法都有一个返回值——要么是显式返回值(通过使用
return
),要么是方法体中计算的最后一个表达式的返回值

put
在Ruby中是一个不幸的方法,因为它在很多初学者示例中都使用过,但它的行为令人困惑。它的副作用是将其参数打印到stdout,但其返回值是
nil
(这常常会让初学者感到困惑,他们希望它返回其参数的值)

第一个方法和第二个方法之间的区别在于,第一个方法由于在内部使用了
put
,因此会产生副作用,将字符串打印到stdout,返回值为
nil
,而第二个方法没有副作用,只是字符串本身的返回值


因此,当您调用第一个方法而不在前面放置
时,会出现打印字符串的副作用,您会看到输出。当调用第二个方法时,没有打印副作用,因此为了将字符串打印到stdout,必须调用
put
put
的参数是
stats
方法的返回值,即要打印的字符串

这对我来说似乎很管用。也许我遗漏了什么?代码没有错,只是试图理解两种方式的细微差别,我看错了问题。很高兴你得到了你的答案。这对我来说似乎很有效。也许我遗漏了什么?代码没有错,只是试图理解两种方式的细微差别,我看错了问题。很高兴你得到了答案。谢谢你的建设性回答。。。既然你提到了puts——我不能参考文献,但在一本书中,我发现了一种写方法的更长的方法(以说明R的编程概念和操作行为)——你会知道写puts的替代方法吗?或者参考?
put
在许多情况下都很有用。这是将整行代码写入流的最佳方式,例如stdout(
$stdout.puts(my_string)
)、stderr(
$stderr.puts(my_string)
)或打开的文件处理程序(
file.open(
file.open('somefile.txt','w'){f | f.puts('my_string')}
)。需要记住的关键是,它返回
nil
。为了调试目的而试图打印值时的一个常见错误是在方法体的最后一行(即隐式返回值)前面添加一个
put
,忘记了这也会将方法的返回值更改为
nil
。尝试使用 def stats(ppg) if ppg > 20 "The PG is considered elite" else "The PG is not considered elite" end end puts stats(28)