【问题标题】:How does Ruby parse: a.b = B.new a.b.c = C.new?Ruby 如何解析:a.b = B.new a.b.c = C.new?
【发布时间】:2018-03-08 18:37:50
【问题描述】:

我假设它把它当作

a.b = (B.new (a.b.c = C.new))

这是行:

request.transactionRequest.payment = PaymentType.new request.transactionRequest.payment.creditCard = CreditCardType.new('4242424242424242','0220','123')

https://developer.authorize.net/hello_world/

我假设它会将其视为

request.transactionRequest.payment = ( PaymentType.new ( request.transactionRequest.payment.creditCard = CreditCardType.new('4242424242424242','0220','123') ) )

如果payment 已经设置好了,如何分配payment.creditCard?那不会产生零指针错误吗?即使它有效,当你刚刚设置payment.creditCard时,你为什么要这样做覆盖payment

【问题讨论】:

  • 写这样的代码是你遇到麻烦的地方。在一行中进行多项作业的动机是什么?
  • @tadman 您是否假设我创建了 Authorize.net 页面和代码?
  • a.b.c = C.new 可以被认为具有C.new 的值,但作为副作用分配给变量。我很确定您显示的代码只有在之前定义了 a.b 时才有效。
  • 从你的问题中不清楚它是从哪里来的。那个外部链接只是被扔在那里没有解释。
  • 那个示例代码太糟糕了。浮动货币价值!?

标签: ruby authorize.net


【解决方案1】:

它缺少一个换行符,仅此而已:

request.transactionRequest.payment = PaymentType.new
request.transactionRequest.payment.creditCard = CreditCardType.new('4242424242424242','0220','123')

虽然单行版本是有效的 Ruby 语法,但你也不会在没有正当理由的情况下在生产代码中执行此操作。

【讨论】:

  • 单行版本是有效的 Ruby 语法,但不太可能工作,因为它会在 request.transactionRequest.payment 初始化之前尝试设置 request.transactionRequest.payment.creditCard
  • @Max 是的,有效的语法和有效的代码是有区别的。前者可以解析,后者可以执行。
  • 哇,你是对的。 github.com/AuthorizeNet/sample-code-ruby/blob/master/… HTML 一定被破坏了。
猜你喜欢
  • 2022-10-21
  • 1970-01-01
  • 2018-09-15
  • 1970-01-01
  • 2014-09-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-04
相关资源
最近更新 更多