是否可以将数组的所有元素传递给ParamArray?
例如,我想将ParamArray传递给另一个ParamArray:
Sub test()
p1 "test", "banane", "birne"
End Sub
Sub p1(ParamArray keys() As Variant)
p2 keys 'should be the same as: p2 "test", "banane", "birne"
End Sub
Sub p2(ParamArray keys() As Variant)
Dim key As Variant
For Each key In keys
Debug.Print key 'Run-time error '13' Type mismatch (key is an array)
Next key
End Sub
Run Code Online (Sandbox Code Playgroud)
在这种情况下,ParamArray p2不包含元素keys,但它获取数组对象keys.因此,我必须检查,如果传递数组:
Sub test()
p1 "test", "banane", "birne"
p2 "test", "banane", "birne"
End Sub
Sub p1(ParamArray keys() As …Run Code Online (Sandbox Code Playgroud) public ActionResult DoSomething(string[] arr, bool someBool, int someInt) { }
试图从jQuery调用上面的方法:
var test = [];
test.push('dog');
test.push('cat');
$container.load('MyController/DoSomething',
{ 'arr[]': test, 'someBool': true, 'someInt': 1 },
function(response, status, xhr) {
// ...
});
Run Code Online (Sandbox Code Playgroud)
数组参数为空,其他参数都很好.我究竟做错了什么?
Chrome开发人员工具会将提交的表单数据显示为
arr%5B%5D%5B%5D:dog
arr%5B%5D%5B%5D:cat
someBool:true
someInt:1
Run Code Online (Sandbox Code Playgroud)
不知道那里发生了什么,但看起来不对我
我正在编写一个C#api客户端,对于大多数发布请求,我使用FormUrlEncodedContent发布数据.
List<KeyValuePair<string, string>> keyValues = new List<KeyValuePair<string, string>>();
keyValues.Add(new KeyValuePair<string, string>("email", email));
keyValues.Add(new KeyValuePair<string, string>("password", password));
var content = new FormUrlEncodedContent(keyValues);
Run Code Online (Sandbox Code Playgroud)
但现在我需要将一个字符串数组作为一个参数发布.有些事情如下.
string[] arr2 = { "dir1", "dir2"};
Run Code Online (Sandbox Code Playgroud)
如何使用c#HttpClient将此数组与其他字符串参数一起发送.
某些预定义方法在其签名中包含ParamArray.但是,代表在签名中不能包含ParamArray.
问题:假设您希望为需要ParamArray的特定方法创建委派机制.你会如何解决这个约束?
编辑:只是为了说清楚,假设你不能改变方法签名本身(预定义的方法,由一些第三方定义,无论是否微软).
EDIT2:这里真正的优点是保持语法糖,因为以下代码确实有效,但消除了糖:
Public Delegate Sub MyDelegate(ByVal myArgs() As Object)
Public Sub PredefinedSub(ByVal ParamArray myArgs() As Object)
'...'
End Sub
Sub Test()
Dim aDelegate As New MyDelegate(AddressOf PredefinedSub)
aDelegate.Invoke(New Object() {1, 2, 3, 4})
End Sub
Run Code Online (Sandbox Code Playgroud)
EDIT3:事实证明,Skeet的解决方案也适用于创建包含ParamArray的事件和操作符.
在F#中,你如何理解接受可变数量参数的函数?
我有这样的代码...(日志功能只是一个例子,确切的实现并不重要)
let log (msg : string) =
printfn "%s" msg
log "Sample"
Run Code Online (Sandbox Code Playgroud)
它使用sprintf格式化的字符串在整个代码中调用,例如.
log (sprintf "Test %s took %d seconds" "foo" 2.345)
Run Code Online (Sandbox Code Playgroud)
我想在日志函数中讨论sprintf功能,看起来像......
logger "Test %s took %d seconds" "foo" 2.345
Run Code Online (Sandbox Code Playgroud)
我尝试过类似的东西
let logger fmt ([<ParamArray>] args) =
log (sprintf fmt args)
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何将ParamArray参数传递给sprintf调用.
这是如何在F#中完成的?
我曾经拥有的:
Public Sub Subscribe(channel As ChannelType)
Public Sub Subscribe(channels As IEnumerable(Of ChannelType))
Run Code Online (Sandbox Code Playgroud)
第一个只调用第二个{channel}将其参数转换为数组.
我决定必须创建一个传递给方法的通道列表是很尴尬的,并选择将两个重载组合成一个需要a的方法ParamArray.
Public Sub Subscribe(ParamArray channels() As ChannelType)
'Usage
Subscribe(ChannelType.News)
Subscribe(ChannelType.News, ChannelType.Sports)
Subscribe() 'Oops... this is valid
Run Code Online (Sandbox Code Playgroud)
这里的"最佳实践"是什么?我喜欢灵活性,这ParamArray让我只是让人们传递内容,但它无法通过编译器错误反馈帮助开发人员"失败更快"...这意味着像这样的东西ArgumentException是不可能的,因为人们消费这个方法可能不会编写任何单元测试.一个选项是以下......
Public Sub Subscribe(channel As ChannelType)
Public Sub Subscribe(channel As ChannelType, ParamArray channels() As ChannelType)
Run Code Online (Sandbox Code Playgroud)
但我觉得这让我几乎回到原点,令人困惑,并要求我对这种方法的实施不那么直截了当.
我正在创建一个名为 的 VBA 函数 (UDF) MyUDF(),它包装CallByName().
我希望精确模仿 的签名和参数行为CallByName()。此外,MyUDF()必须将其Args()参数复制到模块化变量ArgsCopy\xe2\x80\x94 一个Variant数组 \xe2\x80\x94 ,然后将其元素MyUDF()作为进一步的参数传递给CallByName()传递给。
不要问为什么 \xe2\x80\x94 这是一个很长的故事。
\nCallByName()在 VBA 编辑器中显示如下

文档中是这样描述的:
\n\n句法
\nCallByName (对象,过程名称,调用类型, [args()]_)
\nCallByName函数语法具有以下命名参数:
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n
部分 描述 目的 必需:变体(对象)。将在其上执行函数的对象的名称。 进程名 必需:变体 …
vba parameter-passing wrapper user-defined-functions paramarray
我的sub比较两个字符串列表并返回最接近的匹配.我发现sub会因为"the"和"facility"之类的常见词而被绊倒.我想编写一个函数,提供一个单词数组来排除和检查这些单词的每个字符串,如果找到则排除它们.
这是一个示例输入:
|aNames | bNames | words to exclude
|thehillcrest |oceanview health| the
|oceanview, the|hillCrest | health
Run Code Online (Sandbox Code Playgroud)
预期产出:
|aResults |bResuts
|hillcrest |hillcrest
|oceanview |oceanview
Run Code Online (Sandbox Code Playgroud)
到目前为止,我有:
Dim ub as Integer
Dim excludeWords() As String
'First grab the words to be excluded
If sheet.Cells(2, 7).Value <> "" Then
For y = 2 To sheet.Range("G:G").End(xlDown).Row
ub = UBound(excludeWords) + 1 'I'm getting a subscript out of range error here..?
ReDim Preserve excludeWords(0 To ub)
excludeWords(ub) = sheet.Cells(y, 7).Value
Next y
End If
Run Code Online (Sandbox Code Playgroud)
然后,我的比较函数,使用双循环,将比较A列中的每个字符串与B列.在比较之前,a和b列中的值将通过我们的函数,该函数将检查要排除的这些单词.可能没有要排除的单词,因此参数应该是可选的: …
听起来很简单,但它不起作用.在这个例子中,我想将3个字段的值设置为等于4.我可以做这样的事......
Dim str1 As String = "1"
Dim str2 As String = "2"
Dim str3 As String = "3"
Dim str4 As String = "4"
str2 = str1
str3 = str1
str4 = str1
Run Code Online (Sandbox Code Playgroud)
......但这有点罗嗦(是的,我知道,在大多数情况下,vb是罗嗦的).我想有一些东西可以用来将它减少到一个单行调用,所以我做了这个扩展方法.
Module Module1
Sub Main()
Dim str1 As String = "1"
Dim str2 As String = "2"
Dim str3 As String = "3"
Dim str4 As String = "4"
Console.WriteLine("Extension method return value = {0}", str1.SetEqual(str2, str3, str4))
Console.WriteLine("String 1 = {0}", str1)
Console.WriteLine("String 2 = …Run Code Online (Sandbox Code Playgroud) 如何使用可变数量的参数实现方法?
public class MyClass
{
public static void UseParams(params int[] list)
{
for (int i = 0; i < list.Length; i++)
{
Console.Write(list[i] + " ");
}
Console.WriteLine();
}
}
Run Code Online (Sandbox Code Playgroud)
那我怎么能在F#中做到这一点?
type MyClass() =
member this.SomeMethod(params (args:string array)) = ()
Run Code Online (Sandbox Code Playgroud)
我从上面的代码收到以下错误:
The pattern discriminator 'params' is not defined
Run Code Online (Sandbox Code Playgroud) paramarray ×10
parameters ×3
vb.net ×3
vba ×3
f# ×2
asp.net-mvc ×1
byref ×1
c# ×1
currying ×1
delegates ×1
excel ×1
excel-vba ×1
httpclient ×1
jquery ×1
load ×1
post ×1
printf ×1
string ×1
wrapper ×1