两者对比
Objective-C | Ruby |
---|---|
NSNumber | Number |
NSMutableString | String |
NSRange | Range |
NSMutableArray | Array |
NSMutableDictionary | Hash |
NSString | Symbol |
数字
四则运算
OC:
printf("%d\n", (10 + 3)); // => 13
printf("%d\n", (10 - 3)); // => 7
printf("%d\n", (10 * 3)); // => 30
printf("%d\n", (10 / 3)); // => 3
printf("%f\n", (10.0 / 3)); // => 3.333333
printf("%f\n", (10 / 3.0)); // => 3.333333
printf("%d\n", (10 % 3)); // => 1
NSLog(@"%@", @( (10.0/3.0) ) ); // => 3.333333333333333
ruby:
puts 10 + 3 # => 13
puts 10 - 3 # => 7
puts 10 * 3 # => 30
puts 10 / 3 # => 3
puts 10.0 / 3 # => 3.3333333333333335
puts 10 / 3.0 # => 3.3333333333333335
puts 10 % 3 # => 1
-
OC
中NSNumber
不具有四则运算的方法,所以可以使用C
语言的四则运算,再转换为OC的对象类型
查看对象类型
OC:
NSLog(@"%@", NSStringFromClass( @(5).class ) ); // => __NSCFNumber
ruby:
puts 5.class # => Integer
浮点运算的不准确性
OC:
printf("%f\n", (3.51212 + 1)); // => 4.512120
printf("%d\n", ( 4.51212 == (3.51212 + 1) )); // => 0
// NSDecimalNumber
NSDecimalNumber * d0 = [NSDecimalNumber decimalNumberWithString:@"4.51212"];
NSDecimalNumber * d1 = [NSDecimalNumber decimalNumberWithString:@"3.51212"];
NSDecimalNumber * d2 = [NSDecimalNumber decimalNumberWithString:@"1"];
NSDecimalNumber * d3 = [d1 decimalNumberByAdding:d2];
printf("%d\n", ( d0.doubleValue == d3.doubleValue )); // => 1
ruby:
puts (3.51212 + 1) # => 4.5121199999999995
puts 4.51212 == (3.51212 + 1) # => false
# bigdecimal
require 'bigdecimal'
puts BigDecimal("4.51212") == BigDecimal("3.51212") + BigDecimal("1") # => true
问题:如何判断数字的奇偶数
OC:
int n=10;
if(n!=0 && n%2==0){
NSLog(@"该数是偶数");
}else if(n%2==1){
NSLog(@"该数是奇数");
}else{
NSLog(@"该数是0");
}
ruby:
num = 10
if num % 2 == 0
puts "偶数"
else
puts "奇数"
end
puts 10.odd? # => false
puts 10.even? # => true
问题:数字如何四舍五入保留两位小数
OC:
printf("%.2f\n",3.333); // => 3.333
printf("%.2f\n",4.518); // => 4.518
ruby:
puts 3.333.round(2) # => 3.33
puts 4.518.round(2) # => 4.52
字符串
使用方法
OC:
NSMutableString * name = @"编程".mutableCopy;
ruby:
name = "编程"
字符串修改
OC:
NSMutableString * name = @"小明".mutableCopy;
NSNumber * age = @(18);
NSMutableString * tmpStr = @"你好,我是".mutableCopy;
[tmpStr appendString:name];
[tmpStr appendString:@",我今年"];
[tmpStr appendString:age.stringValue];
[tmpStr appendString:@"岁"];
NSLog(@"%@", tmpStr); // 你好,我是小明,我今年18岁
NSLog(@"你好,我是%@,我今年%@岁", name, age); // 你好,我是小明,我今年18岁
字符串 => 数组
ruby:
name = "小明"
age = 18
puts "你好,我是" + name + ",我今年" + age.to_s + "岁" # => 你好,我是小明,我今年18岁
puts "你好,我是#{name},我今年#{age}岁" # => 你好,我是小明,我今年18岁
引号中的引号
OC:
NSLog(@"\"小明\""); // "小明"
ruby:
puts "\"小明\""
puts %q("小明")
puts %Q("小明")
范围
OC:
NSRange range = NSMakeRange(0, 10);
NSLog(@"位置:%ld 长度:%ld", range.location, range.length); // # => 位置:0 长度:10
ruby:
(1..5).to_a # 1 到 5
(1...5).to_a # 1 到 4
('a'..'z').to_a
('A'..'Z').to_a
- OC的NSRange是结构体,ruby的Range的对象
- NSRange常用于字符串截取
- Range可转为Array
数组
数组初始化
OC:
NSMutableArray * thoughts = @[@"儒家", @"道家", @"墨家", @"法家"].mutableCopy;
ruby:
thoughts = ["儒家", "道家", "墨家", "法家"]
数组取值
OC:
NSMutableArray * thought = @[@"儒家", @"道家", @"墨家", @"法家"].mutableCopy;
NSLog(@"%@", thought[1]); // => 道家
NSLog(@"%@", thought.firstObject); // => 儒家
NSLog(@"%@", thought.lastObject); // => 墨家
ruby:
thoughts = ["儒家", "道家", "墨家", "法家"]
p thoughts[1] # => 道家
p thoughts[-1] # => 法家
p thoughts.first # => 儒家
p thoughts.last # => 法家
-
ruby
索引值可为负数,代表方向取值
问题:把数组 [1, 2, 3, 4, 5] 变成 [1, 3, 5, 7, 9]
OC:
NSMutableArray * arr = @[@(1), @(2), @(3), @(4), @(5)].mutableCopy;
NSMutableArray * arr2 = @[].mutableCopy;
[arr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSNumber * num = obj;
NSInteger i = num.integerValue;
[arr2 addObject:@( (i * 2 - 1) )];
}];
NSLog(@"%@", arr2);// => (1, 3, 5, 7, 9)
ruby:
list = [1, 2, 3, 4, 5]
list.map {
|i| i * 2 - 1
}
p list # [1, 3, 5, 7, 9]
哈希
hash
的生成和取值
OC:
NSMutableDictionary * thoughtDict = @{
@"儒家": @"孔子",
@"道家": @"老子",
@"墨家": @"墨子"
}.mutableCopy;
NSLog(@"%@",thoughtDict[@"道家"]); // => 老子
ruby:
thought_hash = {
儒家: "孔子",
道家: "老子",
墨家: "墨子"
}
puts th_hash[:道家] # => 老子
hash
的所有键和所有值
OC:
NSMutableDictionary * thoughtDict = @{
@"儒家": @"孔子",
@"道家": @"老子",
@"墨家": @"墨子"
}.mutableCopy;
NSLog(@"%@",thoughtDict.allKeys);
/*
*/
NSLog(@"%@",thoughtDict.allValues);
/*
*/
[thoughtDict enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
NSLog(@"%@", key);
NSLog(@"%@", obj);
}];
ruby:
thought_hash = {
儒家: "孔子",
道家: "老子",
墨家: "墨子"
}
puts thought_hash.keys # =>
puts thought_hash.values # =>
profile.each do |key, value|
puts key
puts value
end
符号
定义
OC:
NSString * hello = @"hello";
ruby:
:hello
-
Symbol
是不可变的对象 -
Symbol
是带变量名的对象
参考资料:
railsbook
- 持续更新。
- 若有更好的资料,感谢交流。
- 若有错误的内容,感谢斧正。
网友评论