Swift 允许定义我们自己的优先级组以用于我们的自定义运算符。有一件事我很难理解,那就是 bool 型 assignment 属性。
来自 Swift 编程语言(Swift 3.1):
The assignment of a precedence group specifies the precedence of an operator when used in an operation that includes optional chaining. When set to
true, an operator in the corresponding precedence group uses the same grouping rules during optional chaining as the assignment operators from the standard library. Otherwise, when set tofalseor omitted, operators in the precedence group follows the same optional chaining rules as operators that don’t perform assignment.
它没有详细说明assignment 属性的确切行为。可选链中的赋值运算符和非赋值运算符有什么区别?
我定义了++=(表现得像+=)和++(表现得像+)运算符以及用于测试的 AssignmentTesting 结构。
precedencegroup AssignmentTrue {
assignment: true
}
precedencegroup AssignmentFalse {
assignment: false
}
infix operator ++=: AssignmentTrue
infix operator ++: AssignmentFalse
extension Int {
static func ++= (left: inout Int, right: Int) {
left += right
}
static func ++ (left: Int, right: Int) -> Int {
return left + right
}
}
struct AssignmentTesting { var number = 0 }
var assignmentTesting: AssignmentTesting? = AssignmentTesting()
assignmentTesting?.number ++= 3 // assigns 0 + 3 to assignmentTesting.number
assignmentTesting!.number ++ 5 // returns 3 + 5
assignmentTesting?.number // == 3
assignment: true 和 assignment: false 如何影响这些行为?非常欢迎任何解释。
最佳答案
您的示例代码很好地描述了区别:
// assigns (assignmentTesting!.number + 3) to assignmentTesting!.number when assignmentTesting != nil
// Do nothing when assignmentTesting == nil
assignmentTesting?.number ++= 3
// assigns (assignmentTesting!.number + 3) to assignmentTesting!.number when assignmentTesting != nil
// Crashing when assignmentTesting == nil
assignmentTesting!.number ++= 3
// Does not compile
//assignmentTesting?.number ++ 5
// returns (assignmentTesting!.number + 5) when assignmentTesting != nil
// Crashing when assignmentTesting == nil
assignmentTesting!.number ++ 5
当 ++= 是赋值运算符时,像 assignmentTesting?.number++= 3 这样的可选链的工作方式非常类似于:
(assignmentTesting != nil) ? (assignmentTesting!.number ++= 3) as Void? : nil
但是当 ++ 不是赋值运算符时,assignmentTesting?.number++ 5 在 Swift 中不是一个有效的表达式并且不能作为:
(assignmentTesting != nil) ? (assignmentTesting!.number ++ 5) as Int? : nil
关于swift - 了解 Swift 3.1 中优先组的分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45134496/
通过rubykoans.com,我在about_array_assignment.rb中遇到了这两段代码你怎么知道第一个是非并行赋值,第二个是一个变量的并行赋值?在我看来,除了命名差异之外,代码几乎完全相同。4deftest_non_parallel_assignment5names=["John","Smith"]6assert_equal["John","Smith"],names7end45deftest_parallel_assignment_with_one_variable46first_name,=["John","Smith"]47assert_equal'John
我早就知道Ruby中的“常量”(即大写的变量名)不是真正常量。与其他编程语言一样,对对象的引用是唯一存储在变量/常量中的东西。(侧边栏:Ruby确实具有“卡住”引用对象不被修改的功能,据我所知,许多其他语言都没有提供这种功能。)所以这是我的问题:当您将一个值重新分配给常量时,您会收到如下警告:>>FOO='bar'=>"bar">>FOO='baz'(irb):2:warning:alreadyinitializedconstantFOO=>"baz"有没有办法强制Ruby抛出异常而不是打印警告?很难弄清楚为什么有时会发生重新分配。 最佳答案
假设您在Ruby中执行此操作:ar=[1,2]x,y=ar然后,x==1和y==2。是否有一种方法可以在我自己的类中定义,从而产生相同的效果?例如rb=AllYourCode.newx,y=rb到目前为止,对于这样的赋值,我所能做的就是使x==rb和y=nil。Python有这样一个特性:>>>classFoo:...def__iter__(self):...returniter([1,2])...>>>x,y=Foo()>>>x1>>>y2 最佳答案 是的。定义#to_ary。这将使您的对象被视为要分配的数组。irb>o=Obje
这是针对我无法破坏的现有公共(public)API,但我确实希望对其进行扩展。目前,该方法采用字符串或符号或任何其他在作为第一个参数传递给send时有意义的内容我想添加发送字符串、符号等列表的功能。我可以只使用is_a吗?数组,但还有其他发送列表的方法,这不是很像ruby。我将调用列表中的map,所以第一个倾向是使用respond_to?:map。但是字符串也会响应:map,所以这行不通。 最佳答案 如何将它们全部视为数组?String的行为与仅包含String的Array相同:deffoo(obj,arg)[*arg].eac
我正在使用Dragonfly在Rails3.1应用程序上处理图像。我正在努力通过url将图像分配给模型。我有一个很好的表格:{:multipart=>true}do|f|%>RemovePicture?Dragonfly的文档指出:Dragonfly提供了一个直接从url分配的访问器:@album.cover_image_url='http://some.url/file.jpg'但是当我在控制台中尝试时:=>#ruby-1.9.2-p290>picture.image_url="http://i.imgur.com/QQiMz.jpg"=>"http://i.imgur.com/QQ
我经常将预配置的lambda插入可枚举的方法中,例如“map”、“select”等。但是“注入(inject)”的行为似乎有所不同。例如与mult4=lambda{|item|item*4}然后(5..10).map&mult4给我[20,24,28,32,36,40]但是,如果我制作一个2参数lambda用于像这样的注入(inject),multL=lambda{|product,n|product*n}我想说(5..10).inject(2)&multL因为“inject”有一个可选的单个初始值参数,但这给了我......irb(main):027:0>(5..10).inject
是否有self验证的问题列表。看着那个,我可以确定我知道。我应该复习一下。在学习的过程中,我列了一个这样的list,但它只包含我在某处听说过的项目。我需要一段时间才能找到新的东西。 最佳答案 以下是针对ruby和Rails的一些测试列表。证书名称:RubyonRails谁提供:oDeskIncorporation认证费用:免费网站:https://www.odesk.com/tests/985?pos=0证书名称:RubyonRails提供者:Techgig.com(TimesBusinessSolutionsLimited(T
使用Paperclip,我想从这样的URL抓取图像:require'open-uri'user.photo=open(url)问题是我最后得到一个像“open-uri20110915-4852-1o7k5uw”这样的文件名。有什么方法可以更改user.photo上的文件名?作为一个额外的变化,Paperclip将我的文件存储在S3上,所以如果我可以在初始分配中设置我想要的文件名就更好了,这样图像就会上传到正确的S3key。像这样:user.photo=open(url),:filename=>URI.parse(url).path 最佳答案
这是我理想中想要的。用户做:a="hello"输出为Youjustallocated"a"!=>"Hello"顺序无关紧要,只要我能实现该消息即可。 最佳答案 不,没有直接的方法可以做到这一点,因为在执行代码之前,Ruby字节码编译器会丢弃局部变量名。YARV(MRI1.9.2中使用的RubyVM)提供的关于局部变量的唯一指令是getlocal和setlocal,它们都对整数索引进行操作,而不是变量名。以下是1.9.2源代码中insns.def的摘录:/****************************************
我想覆盖store_accessor的getter。可以查到here.代码在这里:#Fileactiverecord/lib/active_record/store.rb,line74defstore_accessor(store_attribute,*keys)keys=keys.flatten_store_accessors_module.module_evaldokeys.eachdo|key|define_method("#{key}=")do|value|write_store_attribute(store_attribute,key,value)enddefine_met