标签: method-chaining

JavaScript 链式连接函数?

请不要使用 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)

javascript string join concatenation method-chaining

2
推荐指数
1
解决办法
3101
查看次数

何时在方法中返回“this”而不是“void”,为什么?

在修改自身的方法中返回对“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)

相关问题似乎不同用户的答案相互矛盾。

这个问题也与引用在对象创建中使用的流畅接口的答案类似。

c# oop fluent-interface method-chaining

2
推荐指数
1
解决办法
1247
查看次数

Rust 仅在拆分为多个语句时才编译方法链

当我遇到此错误时,我正在解析文件中的一些字符串输入。通常,如果将一系列方法链接在一行上或将它们分成多个操作,则不会产生任何影响。然而,当方法链在一行中时,它不会编译。

当像这样分割成多个语句时,我不会收到错误(链接到游乐场)

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)

compiler-errors compilation function method-chaining rust

2
推荐指数
1
解决办法
470
查看次数

我们可以在列表上使用链方法吗?

我来自 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,这似乎是太多的工作。

ruby python method-chaining

2
推荐指数
1
解决办法
624
查看次数

链接到极端的语言?

所以,我只是在思考酷链是多么简单,以及它如何让事情变得更容易阅读.有很多语言,当将一堆函数应用于变量时,你会写下这样的东西:

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)

language-agnostic fluent-interface method-chaining

1
推荐指数
1
解决办法
375
查看次数

用块链接的Ruby方法 - 容易混淆的语法错误

所以,我认为我很聪明,我添加这样的方法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而不是块工作正常,但显然太笨重,不能用于我的目的.

ruby syntax block method-chaining

1
推荐指数
1
解决办法
618
查看次数

创建一个新的jquery链式方法

你如何在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();

jquery jquery-plugins method-chaining

1
推荐指数
1
解决办法
1108
查看次数

Perl - 链接方法调用

我有一个类,并希望按严格的顺序链接其方法调用,但无法弄清楚如何做到这一点.

# 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)

methods perl method-chaining

1
推荐指数
1
解决办法
679
查看次数

方法链接的返回类型

使用方法链时的返回类型是什么?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)

coldfusion method-chaining chaining coldfusion-11

1
推荐指数
1
解决办法
121
查看次数

Kotlin方法链接到列表中的字符串

我有一个字符串列表,我得到的字符串拆分.我需要从列表中的字符串中删除周围的引号.使用方法链接我该如何实现?我尝试了以下,但没有工作.类型干扰失败.

val splitCountries: List<String> = countries.split(",").forEach{it -> it.removeSurrounding("\"")}
Run Code Online (Sandbox Code Playgroud)

string list method-chaining kotlin

1
推荐指数
1
解决办法
55
查看次数