在过去的两个小时里,我一直在为这种行为挠头:
echo 'max(1, "a", "2" ) : '; var_dump( max( 1, 'a', '2' ) );
echo 'max(1, "2", "a" ) : '; var_dump( max( 1, '2', 'a' ) );
echo 'max( "a", "2", 1) : '; var_dump( max( 'a', '2', 1 ) );
echo 'max( "2", "a", 1) : '; var_dump( max( '2', 'a', 1 ) );
echo "\n";
echo 'min(1, "a", "2" ) : '; var_dump( min( 1, 'a', '2' ) );
echo 'min(1, "2", "a" ) : '; var_dump( min( 1, '2', 'a' ) );
echo 'min( "a", "2", 1) : '; var_dump( min( 'a', '2', 1 ) );
echo 'min( "2", "a", 1) : '; var_dump( min( '2', 'a', 1 ) );
打印出:
max(1, "a", "2" ) : string(1) "2"
max(1, "2", "a" ) : string(1) "a"
max( "a", "2", 1) : int(1)
max( "2", "a", 1) : int(1)
min(1, "a", "2" ) : string(1) "2"
min(1, "2", "a" ) : string(1) "a"
min( "a", "2", 1) : int(1)
min( "2", "a", 1) : int(1)
当我期待的时候:
max(1, "a", "2" ) : string(1) "2"
max(1, "2", "a" ) : string(1) "2"
max( "a", "2", 1) : string(1) "2"
max( "2", "a", 1) : string(1) "2"
min(1, "a", "2" ) : string(1) "a"
min(1, "2", "a" ) : string(1) "a"
min( "a", "2", 1) : string(1) "a"
min( "2", "a", 1) : string(1) "a"
请注意,max() 和min() 函数的值始终相同,只是顺序不同。
此外,根据文档,与整数相比,不是以数字字符开头的字符串被评估为整数 0,但多个字符串值按字母数字进行比较。来源:
如何解释这个输出?
最佳答案
min() 中的比较和 max()是按顺序完成的,因为这可以在源代码中看到:
//...
min = &args[0];
for (i = 1; i < argc; i++) {
is_smaller_function(&result, &args[i], min);
if (Z_TYPE(result) == IS_TRUE) {
min = &args[i];
}
}
//...
//...
max = &args[0];
for (i = 1; i < argc; i++) {
is_smaller_or_equal_function(&result, &args[i], max);
if (Z_TYPE(result) == IS_FALSE) {
max = &args[i];
}
}
//...
因此您可以看到该函数遍历数组并检查下一个值是否小于/大于之前保存的最小/最大值。
要了解如何获得这些结果,您还必须知道值的比较是在 PHP type juggling. 之后完成的。
那么让我们看两个例子来了解函数是如何工作的:
max ( 1 , 'a' , '2' )
│ │ │
1 > 'a' │
│ │
1 < '2'
│
└ Result: '2'
比较 1 和 'a',数字上下文意味着 'a' 被转换为 0,1 大于 0。
→ 返回 int 1
比较 1 和 '2',数字字符串意味着 '2' 被转换为 2,2 大于 1。
→ 返回字符串'2'
max ( 1 , '2' , 'a' )
│ │ │
1 < '2' │
│ │
'2' < 'a'
│
└ Result: 'a'
比较 1 和 '2',数字字符串意味着 '2' 被转换为 2,2 大于 1。
→ 返回字符串'2'
比较'2'和'a',两个字符串表示字符串比较,'a'大于'2' 刚刚与 ASCII values 进行了比较.
→ 返回字符串'a'
同样的规则适用于所有其他示例。
关于PHP max() 和 min() 不同类型的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36898382/
我可以得到Infinity和NaNn=9.0/0#=>Infinityn.class#=>Floatm=0/0.0#=>NaNm.class#=>Float但是当我想直接访问Infinity或NaN时:Infinity#=>uninitializedconstantInfinity(NameError)NaN#=>uninitializedconstantNaN(NameError)什么是Infinity和NaN?它们是对象、关键字还是其他东西? 最佳答案 您看到打印为Infinity和NaN的只是Float类的两个特殊实例的字符串
我不确定传递给方法的对象的类型是否正确。我可能会将一个字符串传递给一个只能处理整数的函数。某种运行时保证怎么样?我看不到比以下更好的选择:defsomeFixNumMangler(input)raise"wrongtype:integerrequired"unlessinput.class==FixNumother_stuffend有更好的选择吗? 最佳答案 使用Kernel#Integer在使用之前转换输入的方法。当无法以任何合理的方式将输入转换为整数时,它将引发ArgumentError。defmy_method(number)
我有一个用户工厂。我希望默认情况下确认用户。但是鉴于unconfirmed特征,我不希望它们被确认。虽然我有一个基于实现细节而不是抽象的工作实现,但我想知道如何正确地做到这一点。factory:userdoafter(:create)do|user,evaluator|#unwantedimplementationdetailshereunlessFactoryGirl.factories[:user].defined_traits.map(&:name).include?(:unconfirmed)user.confirm!endendtrait:unconfirmeddoenden
有时我需要处理键/值数据。我不喜欢使用数组,因为它们在大小上没有限制(很容易不小心添加超过2个项目,而且您最终需要稍后验证大小)。此外,0和1的索引变成了魔数(MagicNumber),并且在传达含义方面做得很差(“当我说0时,我的意思是head...”)。散列也不合适,因为可能会不小心添加额外的条目。我写了下面的类来解决这个问题:classPairattr_accessor:head,:taildefinitialize(h,t)@head,@tail=h,tendend它工作得很好并且解决了问题,但我很想知道:Ruby标准库是否已经带有这样一个类? 最佳
我正在尝试解析一个CSV文件并使用SQL命令自动为其创建一个表。CSV中的第一行给出了列标题。但我需要推断每个列的类型。Ruby中是否有任何函数可以找到每个字段中内容的类型。例如,CSV行:"12012","Test","1233.22","12:21:22","10/10/2009"应该产生像这样的类型['integer','string','float','time','date']谢谢! 最佳答案 require'time'defto_something(str)if(num=Integer(str)rescueFloat(s
我正在玩HTML5视频并且在ERB中有以下片段:mp4视频从在我的开发环境中运行的服务器很好地流式传输到chrome。然而firefox显示带有海报图像的视频播放器,但带有一个大X。问题似乎是mongrel不确定ogv扩展的mime类型,并且只返回text/plain,如curl所示:$curl-Ihttp://0.0.0.0:3000/pr6.ogvHTTP/1.1200OKConnection:closeDate:Mon,19Apr201012:33:50GMTLast-Modified:Sun,18Apr201012:46:07GMTContent-Type:text/plain
我基本上来自Java背景并且努力理解Ruby中的模运算。(5%3)(-5%3)(5%-3)(-5%-3)Java中的上述操作产生,2个-22个-2但在Ruby中,相同的表达式会产生21个-1-2.Ruby在逻辑上有多擅长这个?模块操作在Ruby中是如何实现的?如果将同一个操作定义为一个web服务,两个服务如何匹配逻辑。 最佳答案 在Java中,模运算的结果与被除数的符号相同。在Ruby中,它与除数的符号相同。remainder()在Ruby中与被除数的符号相同。您可能还想引用modulooperation.
两个gsub产生不同的结果。谁能解释一下为什么?代码也可在https://gist.github.com/franklsf95/6c0f8938f28706b5644d获得.ver=9999str="\tCFBundleDevelopmentRegion\n\ten\n\tCFBundleVersion\n\t0.1.190\n\tAppID\n\t000000000000000"putsstr.gsub/(CFBundleVersion\n\t.*\.).*()/,"#{$1}#{ver}#{$2}"puts'--------'putsstr.gsub/(CFBundleVersio
RSpec似乎按顺序匹配方法接收的消息。我不确定如何使以下代码工作:allow(a).toreceive(:f)expect(a).toreceive(:f).with(2)a.f(1)a.f(2)a.f(3)我问的原因是a.f的一些调用是由我的代码的上层控制的,所以我不能对这些方法调用添加期望。 最佳答案 RSpecspy是测试这种情况的一种方式。要监视一个方法,用allowstub,除了方法名称之外没有任何约束,调用该方法,然后expect确切的方法调用。例如:allow(a).toreceive(:f)a.f(2)a.f(1)
我在一段非常简单的代码(如我所想)中得到了一个错误的值:org=4caseorgwhenorg=4val='H'endputsval=>nil请不要生气,我希望我错过了一些非常明显的东西,但我真的想不通。谢谢。 最佳答案 这是典型的Ruby错误。case有两种被调用的方法,一种是你传递一个东西作为分支的基础,另一种是你不传递的东西。如果您确实在case中指定了一个表达式语句然后评估所有其他条件并与===进行比较.在这种情况下org评估为false和org===false显然不是真的。所有其他情况也是如此,它们要么是真的,要么是假的。