请不要使用 jQuery!
网上说应该避免使用 JS 的原生String.concat()和join()函数,因为它们的性能较差,而一个简单的+=赋值的for()循环应该会运行得更快。
所以我尝试用纯 JavaScript 创建一个函数来连接字符串。这在某种程度上是我的设想:
我想要一个主函数concatenate(),它将连接所有传递的参数,并在每个连接的参数之后插入一个变量字符串(最后一个参数除外)。
如果 main 函数是单独调用的,并且没有链式.using()函数,则该变量字符串应该为空字符串,这意味着结果中没有分隔符。
我想要一个链接的子函数.using(),它会告诉主concatenate()函数除了默认的 '' 空字符串之外要在每个连接段之后添加哪些特定字符串。
理论上,它应该像这样工作:
concatenate('a','b','c'); /* result: 'abc' */
concatenate('a','b','c').using('-'); /* result: 'a-b-c' */
Run Code Online (Sandbox Code Playgroud)
我想避免使用两个单独的函数,例如concatenate()和concatenateUsing(),因为concatenateUsing()变体必须利用特殊的常量参数(例如argument[0]或argument[arguments.length-1])注入的分离器会非常不整洁。另外,我总是忘记那是哪一个。
我还想避免使用具有两个单独的子方法的取代Concatenate对象,例如Concatenate.strings()和Concatenate.using()或类似方法。
这是迄今为止我失败的一些尝试......
尝试#1:
function concatenate()
{
var result="";
if(this.separator===undefined){var separator=false;}
for(var i=0; i<arguments.length; i++)
{result += arguments[i] + ((separator && (i<arguments.length-1))?separator:'');}
this.using=function(x)
{
this.separator=x; …Run Code Online (Sandbox Code Playgroud) 在修改自身的方法中返回对“this”对象的引用有什么好处(或缺点)?什么时候应该使用返回“this”而不是 void?
当查看代码审查堆栈交换的答案时,我注意到答案在自操作方法中使用了“返回此”。
原始类的简化:
class Item
{
public Item(string name)
{
Name = name;
}
public string Name { get; private set; }
public Item AddComponent(ItemComponent component)
{
_components.Add(component);
return this;
}
private List<ItemComponent> _components = new List<ItemComponent>();
}
Run Code Online (Sandbox Code Playgroud)
使用代码简化:
var fireSword = new Item("Lightbringer")
.AddComponent(new Valuable { Cost = 1000 })
.AddComponent(new PhysicalDamage { Slashing = 10 });
Run Code Online (Sandbox Code Playgroud)
相关问题似乎不同用户的答案相互矛盾。
这个问题也与引用在对象创建中使用的流畅接口的答案类似。
当我遇到此错误时,我正在解析文件中的一些字符串输入。通常,如果将一系列方法链接在一行上或将它们分成多个操作,则不会产生任何影响。然而,当方法链在一行中时,它不会编译。
当像这样分割成多个语句时,我不会收到错误(链接到游乐场)
let input = std::fs::read_to_string("tst_input.txt").expect("Failed to read input");
let input = input
.lines()
.map(|l| {
let mut iter = l.split(" | ");
(
iter.next()
.unwrap()
.split_whitespace()
.collect::<Vec<&str>>(),
iter.next()
.unwrap()
.split_whitespace()
.collect::<Vec<&str>>(),
)
})
.collect::<Vec<_>>();
Run Code Online (Sandbox Code Playgroud)
当它出现在像这样的单个语句中时,我会遇到终身错误(链接到游乐场)
let input = std::fs::read_to_string("tst_input.txt")
.expect("Failed to read input")
.lines()
.map(|l| {
let mut iter = l.split(" | ");
(
iter.next()
.unwrap()
.split_whitespace()
.collect::<Vec<&str>>(),
iter.next()
.unwrap()
.split_whitespace()
.collect::<Vec<&str>>(),
)
})
.collect::<Vec<_>>()
Run Code Online (Sandbox Code Playgroud)
error[E0716]: temporary value dropped while borrowed
--> src/main.rs:2:17
|
2 | let …Run Code Online (Sandbox Code Playgroud) 我来自 Ruby,你可以非常轻松地进行方法链。让我们看一个例子。如果我想从列表中选择所有偶数并向其添加 5。我会在 Ruby 中做类似的事情。
nums = [...]
nums.select {|x| x % 2 == 0 }.map { |x| x + 5 }
Run Code Online (Sandbox Code Playgroud)
在Python中变成
nums = [...]
list(map(lambda x: x + 5, filter(lambda x: x % 2 == 0, nums)))
Run Code Online (Sandbox Code Playgroud)
Python 语法看起来很糟糕。我尝试谷歌并没有找到任何好的答案。我所看到的只是如何使用自定义对象实现类似的效果,但没有任何东西可以通过这种方式处理列表。我错过了什么吗?
在调试控制台中时,在数组中获取一些 ActiveRecord 对象曾经非常有帮助,我可以直接链接方法来处理实体以进行调试。对于 Python,这似乎是太多的工作。
所以,我只是在思考酷链是多么简单,以及它如何让事情变得更容易阅读.有很多语言,当将一堆函数应用于变量时,你会写下这样的东西:
i(h(g(f(x))))
Run Code Online (Sandbox Code Playgroud)
你必须从右到左或从最里面到最外面阅读它.您f先申请,然后再申请,g依此类推.但如果它被链接,它看起来会更像
x|f|g|h|i
Run Code Online (Sandbox Code Playgroud)
你可以像普通人一样阅读它.所以,我的问题是,必须有一些语言可以这样做,它们是什么?那些花哨的功能性编程语言是做什么的?
因此,我通常最终创建了一大堆临时变量,以便我可以将它分成不同的行并使其更具可读性:
a = f(x)
b = g(a)
c = h(b)
what_i_really_wanted_all_along = i(c)
Run Code Online (Sandbox Code Playgroud)
我的魔法语言在哪里,如果它们变得太长,你仍然可以将它分成不同的行,而不需要插入变量:
x | f
| g
| h
| i
Run Code Online (Sandbox Code Playgroud) 所以,我认为我很聪明,我添加这样的方法Object:
class Object
def apply_if(cond)
if cond
yield self
else
return self
end
end
end
Run Code Online (Sandbox Code Playgroud)
这(我认为)允许我有条件地向方法链添加位,这简化了我的ActiveRecord查询操作.但它给出了语法错误,我可以将其简化为以下代码:
data = [1,2,3,4,5]
results = data.
apply_if(true and false) do |q|
q + [0,0]
end
Run Code Online (Sandbox Code Playgroud)
同样这个错误:
results = data.apply_if(true and false){|q| q + [0,0]}
Run Code Online (Sandbox Code Playgroud)
但这有效:
results = data.apply_if ((true and false)) {|q| q + [0,0]}
Run Code Online (Sandbox Code Playgroud)
同样如下:
results = data.apply_if (true && false) {|q| q + [0,0]}
Run Code Online (Sandbox Code Playgroud)
我看到这些差异都与运算符优先级有关,但是如何在一对括号内的运算符的优先级很重要?
为什么这里会出现语法错误?我没有看到任何可能的语法歧义,并且这种方法在形状上与Array#reduce方法相同.
我在这里尝试了许多组合 - 带有调用的显式块参数,方法定义中的各种类型的显式优先级.使用lambda而不是块工作正常,但显然太笨重,不能用于我的目的.
你如何在jQuery中编写新的链式方法?我的jQuery中有一个非常程序化的风格:
$("#SaveButton").click(function () {
Foo($("#SubTotal"));
Foo($("#TaxTotal"));
Foo($("#Total"));
Bar($("#SubTotal"));
Bar($("#TaxTotal"));
Bar($("#Total"));
});
Run Code Online (Sandbox Code Playgroud)
如何在jQuery中创建一个.foo()方法,以便我可以编写:
$("#SaveButton").click(function () {
$("#SubTotal,#TaxTotal,#Total").foo().bar();
});
Run Code Online (Sandbox Code Playgroud)
并在相关点-是否有一种简单的方法(在Visual Studio或记事本++或别的东西)来查找和替换所有Foo($("#selector"));用$("#selector").foo();?
我有一个类,并希望按严格的顺序链接其方法调用,但无法弄清楚如何做到这一点.
# Mail.pm
package Mail;
sub new { ... }
sub inbox { ... }
sub folder { ... }
sub count { ... }
1;
Run Code Online (Sandbox Code Playgroud)
然后 ...
use Mail;
my $mail = Mail->new;
# ok
$mail->inbox->count;
$mail->folder('Spam')->count;
# prevent calling inbox() after folder() or vice versa
$mail->inbox->folder('Spam')->count;
$mail->folder('Spam')->inbox->count;
Run Code Online (Sandbox Code Playgroud) 使用方法链时的返回类型是什么?any似乎太通用了.
<cffunction name="get" output="false" returntype="any">
<cfargument name="BossID" type="string" required="false" default="All">
...
<cfreturn this>
</cffunction>
Run Code Online (Sandbox Code Playgroud) 我有一个字符串列表,我得到的字符串拆分.我需要从列表中的字符串中删除周围的引号.使用方法链接我该如何实现?我尝试了以下,但没有工作.类型干扰失败.
val splitCountries: List<String> = countries.split(",").forEach{it -> it.removeSurrounding("\"")}
Run Code Online (Sandbox Code Playgroud) method-chaining ×10
ruby ×2
string ×2
block ×1
c# ×1
chaining ×1
coldfusion ×1
compilation ×1
function ×1
javascript ×1
join ×1
jquery ×1
kotlin ×1
list ×1
methods ×1
oop ×1
perl ×1
python ×1
rust ×1
syntax ×1