以下代码,尽管我认为应该返回一个值,但返回一个数组。
function Do-Something {
123
return 456
}
(Do-Something).GetType() # will say Object[]
我了解到,如果要避免这种情况,我必须像这样将不需要的值通过管道传递给Out-Null
function Do-Something {
123 | Out-Null
return 456
}
但是,为什么以这种方式实现PowerShell,我找不到任何理由。我发现,如果您忘记某些东西具有未捕获的返回值,则可能导致令人讨厌和无声的错误。有人可以解释何时可以派上用场吗?还可以强制Powershell不收集数组中所有未捕获的变量吗?
答案 0 :(得分:5)
PowerShell将脚本或函数中所有语句的输出发送到输出管道中,因为它是一个shell,而shell就是这样工作的。 return
语句有些遗憾,因为函数不会返回对象,而是将对象写入管道。能够终止函数的执行是必要的,但我们可能应该将其称为其他名称。简单地发出对象的能力使简单的脚本变得更简单,因为不需要显式的输出语句或返回。有时会引起问题吗-是的,有时会发生问题。因此,对于V5中引入的类,我们采用了更传统的编程语言语义。如果类中的方法要返回某项,则它必须声明一个返回类型,并且必须使用return
语句返回一个值,否则不执行任何操作将返回。
答案 1 :(得分:2)
任何写入输出流的内容都被视为管道的一部分-import UIKit
class SideMenuVC: UITableViewController {
@IBOutlet weak var nameLabel: UILabel!
var nameTextLabel = String()
override func viewDidLoad() {
super.viewDidLoad()
nameLabel.text = nameTextLabel
print("Label1 \(nameTextLabel)")
}
override func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
print(indexPath.row)
NotificationCenter.default.post(name: NSNotification.Name("ToggleSideMenu"), object: nil)
switch indexPath.row {
case 1: NotificationCenter.default.post(name: NSNotification.Name("ShowLessons"), object: nil)
case 2: NotificationCenter.default.post(name: NSNotification.Name("ShowChat"), object: nil)
case 3: NotificationCenter.default.post(name: NSNotification.Name("ShowNetwork"), object: nil)
case 4: NotificationCenter.default.post(name: NSNotification.Name("ShowLike"), object: nil)
case 5: NotificationCenter.default.post(name: NSNotification.Name("ShowAvtor"), object: nil)
case 6: NotificationCenter.default.post(name: NSNotification.Name("ShowExit"), object: nil)
default: break
}
}
}
在Powershell中有点用词不当。虽然它“返回”一个值,但先前写入输出流的其他任何内容也属于“返回值”的一部分。在Powershell中,使用return
“写入管道并退出当前函数”。比起传统的return
指令对函数或方法而言,更像是break
对循环的作用。
如果要输出return
但不作为管道的一部分,请考虑使用Write-Verbose
,Write-Warning
,Write-Debug
或Write-Host
(是123
的适当用法,因为您不不希望将输出视为管道的一部分。
为什么为什么这样工作,所以在大多数其他Shell语言中都这样工作,应该可以预期。例如,Write-Host
,STDOUT
或cmd
中的任何sh
输出都可以存储在变量中,通过管道传递到另一个命令,或者以其他方式重定向。尽管Powershell是一种功能强大的脚本语言,但它仍然还是一种交互式Shell,并且具有这种行为。
尽管并非只有您一个人认为bash
在大多数其他编程语言的基础上考虑其隐含含义会造成混淆。