Недавно я прошел обучение в Powershell и узнал, что вы обычно не можете возвращать простые типы данных из сложных функций powershell, создавая стандартный синтаксис вызова функции в X = Foo (Bar (Hello («World»))) невозможно/практический. Решение PowerShell должно использовать трубопровод, как в x = Hello «World» | Бар | Foo. Мне было интересно узнать о практических последствиях этой синтаксической разницы. Неужели мы теряем любые полезные языковые конструкции, не выполняя вложенные вызовы функций?Трубы против вложенных функциональных вызовов
0
A
ответ
0
Вы все еще можете использовать вложенные функции в Powershell. Вы просто не называете их, используя тот же синтаксис, которым вы привыкли:
Function Foo { "$($args[0])!" }
Function Bar { $args[0].ToUpper() }
Function Hello { "Hello $($args[0])" }
Foo (Bar (Hello "World"))
HELLO WORLD!
Да, но что вы переходите в Bar и Foo? Объект, созданный powershell, содержащий все значения, возвращаемые из любых вызовов функций, выполненных в предыдущей функции. Эти объекты будут отличаться по своей природе от реализации до реализации. Foo не всегда получает объект, созданный Bar, так как вы можете с уверенностью ссылаться на него? –
Это ничем не отличается от передачи аргументов любой функции. Функция будет спроектирована так, чтобы ожидать определенного типа объекта для ввода. Если он получает тип ввода, для которого он не предназначен, он будет выдавать ошибку. Конвейер свяжет одно свойство объекта с параметром для вас. Если вы передадите объект в качестве параметра, вам нужно будет явно ссылаться на это свойство в функции, но это не запрещает вызовы функций вложенности. – mjolinor
Ваши функции просты, они состоят из одной строки и не выполняют никаких других вызовов функций. Я специально думаю о более сложных функциях, которые они сами выполняют множество вызовов функций, но в конечном итоге должны возвращать простой тип данных. –