在修补一个箱子,我把它放在自己隐藏内部迭代器类型,但作者说,出版类型是一个功能,那最好的做法是公布一个明确的包装结构的公共API中暴露的每一个迭代器.显然,Rust标准库为它的所有迭代器都做了这个.
为什么这样?更具体地说,如果实现一个兼容的类型,std::env::Args使用的优缺点是什么......
// implement iterator compatible with std::env::Args
pub struct Args { // public
// pub(crate) ...
}
impl Iterator for Args {
// ...
}
pub fn args() -> Args {
// ...
// return Args
}
Run Code Online (Sandbox Code Playgroud)
VS
// implement iterator compatible with std::env::Args
pub(crate) struct Args { // hidden (outside of crate)
// pub(crate) ...
}
impl Iterator for Args {
// ...
}
pub fn args() -> impl Iterator<Item = String> {
// ...
// …Run Code Online (Sandbox Code Playgroud) 我尝试使用 $function:foo 值和 get-item function:foo。所有尝试都成功修改了临时函数对象,但在重新分配给存储函数时(通过 $function:foo = ... 或 set-item function:foo ...),附加属性丢失。
以下是我尝试的结果(全部失败):
设置
$=>函数 foo { "foo" }
$=>$f = $函数:foo
$=>$f = $f | 添加成员注释属性栏 BARvalue -pass
$=>$f | 通用汽车*
类型名称:System.Management.Automation.ScriptBlock
名称 成员类型 定义
---- ---------- ----------
bar NoteProperty System.String bar=BARvalue
#1
$=>设置项函数:f $f -force $=>$函数:foo | 通用汽车* >
#2
$=>$函数:f = $f $=>$函数:foo | 通用汽车* >
#3
$=>$f = 获取项目函数:foo $=>$f | 通用汽车 类型名称:System.Management.Automation.FunctionInfo 名称 成员类型 定义 ---- ---------- ---------- 等于方法 System.Boolean Equals(Object obj) GetHashCode 方法 System.Int32 …
我试图处理/过滤器输入一个VBScript中,但只有在输入已通过管道输送到脚本.我不希望脚本处理用户/键盘输入.我想用这样的代码编写代码:
stdin_is_tty = ...
if not stdin_is_tty then
...
input = WScript.StdIn.ReadAll
end if
Run Code Online (Sandbox Code Playgroud)
否则,脚本将挂起,在执行时等待用户输入WScript.StdIn.ReadAll(如果我测试流,则甚至更早WScript.StdIn.AtEndOfStream).
在C#中,我使用:
stdin_is_tty = not System.Console.IsInputRedirected // NET 4.5+
Run Code Online (Sandbox Code Playgroud)
在接受答案的问题:"如果Console.In(标准输入)已经被重定向如何检测?" 显示如何通过P/Invoke使用Win32调用为早于.NET 4.5的.NET版本构建该结果.但我不知道有任何方法将该方法转换为VBscript.
我构建了一个笨拙的部分解决方案,SendKeys用于将流末尾序列发送到脚本的键盘缓冲区.但是如果STDIN 被重定向,解决方案会在缓冲区中留下密钥,除非我知道STDIN被重定向,否则我无法清理...所以,同样的问题.
我宁愿将脚本保存在一个打包的部分中,所以我宁愿避免单独的包装脚本或通用Windows 7+安装中没有的任何东西.
任何精彩的想法或解决方法?
编辑:添加初始解决方案的副本
我在这里添加了我改进的初始解决方案的副本(不可否认,这是一个"黑客"),现在它已经清理了,但仍有几个底片:
input = ""
stdin_is_tty = False
test_string_length = 5 ' arbitrary N (coder determined to minimize collision with possible inputs)
sendkey_string = ""
test_string = ""
for i = 1 to test_string_size
sendkey_string = …Run Code Online (Sandbox Code Playgroud)