迭代数组并返回自身

时间:2017-08-24 20:43:35

标签: crystal-lang

此代码:security: encoders: AppBundle\Entity\User: bcrypt # http://symfony.com/doc/current/book/security.html#where-do-users-come-from-user-providers providers: database_users: entity: { class: AppBundle:User, property: username} firewalls: secured_area: pattern: ^/ anonymous: true form_login: login_path: login check_path: login csrf_token_generator: security.csrf.token_manager logout: path: security_logout target: homepage access_control: - { path: ^/admin, roles: ROLE_ADMIN } 生成p [1, 2].each{ "foo" },而我希望它在迭代后放置nil。如何在水晶?

2 个答案:

答案 0 :(得分:4)

使用tap

p [1, 2].tap &.each { "foo" } # => [1, 2]

它会向块生成self,然后返回self。

另一个选项(不是更好)可能会创建一个自定义方法,只需在执行每个方法后返回self:

class Array
  def each_with_self
    each { |x| yield x  }
    self
  end
end

p [1, 2].each_with_self { "foo" } # => [1, 2]

答案 1 :(得分:1)

对于您要求的情况,在p(..)中使用parens就足够了,因为p会将参数作为结果返回。

p([1, 2]).each{ "foo" }

p的这种行为可以在表达式中间轻松检查,即将foo(bar, baz)更改为foo(p(bar), baz)

对于#each,在晶体中决定返回nil以改进生成的代码,因为大多数时候都没有使用该值。这也可以防止在一天结束时产生一些工会。