ฉันใหม่กับการเขียนโปรแกรม ใครสามารถอธิบายสิ่งที่.map
จะทำใน:
params = (0...param_count).map
ฉันใหม่กับการเขียนโปรแกรม ใครสามารถอธิบายสิ่งที่.map
จะทำใน:
params = (0...param_count).map
คำตอบ:
map
วิธีการใช้เวลานับวัตถุและกระชากและวิ่งบล็อกสำหรับแต่ละองค์ประกอบ, การแสดงผลแต่ละค่ากลับมาจากบล็อก (วัตถุเดิมไม่เปลี่ยนแปลงเว้นแต่คุณจะใช้map!)
:
[1, 2, 3].map { |n| n * n } #=> [1, 4, 9]
Array
และRange
เป็นประเภทที่นับได้ map
ด้วยบล็อกส่งกลับอาร์เรย์ map!
กลายพันธุ์อาร์เรย์เดิม
สิ่งนี้มีประโยชน์ที่ไหนและอะไรคือความแตกต่างระหว่างmap!
และeach
? นี่คือตัวอย่าง:
names = ['danil', 'edmund']
# here we map one array to another, convert each element by some rule
names.map! {|name| name.capitalize } # now names contains ['Danil', 'Edmund']
names.each { |name| puts name + ' is a programmer' } # here we just do something with each element
ผลลัพธ์:
Danil is a programmer
Edmund is a programmer
map
ว่าmap!
map
พร้อมกับselect
และeach
เป็นหนึ่งในผลงานของ Ruby ในรหัสของฉัน
ช่วยให้คุณสามารถดำเนินการกับวัตถุของอาร์เรย์และคืนค่าทั้งหมดในที่เดียวกัน ตัวอย่างคือการเพิ่มอาร์เรย์ของตัวเลขโดยหนึ่ง:
[1,2,3].map {|x| x + 1 }
#=> [2,3,4]
หากคุณสามารถเรียกใช้วิธีการเดียวกับองค์ประกอบของอาร์เรย์คุณสามารถทำได้ในรูปแบบชวเลข
เมื่อต้องการทำสิ่งนี้กับตัวอย่างด้านบนคุณต้องทำอะไรแบบนี้
class Numeric
def plusone
self + 1
end
end
[1,2,3].map(&:plusone)
#=> [2,3,4]
หากต้องการใช้เทคนิคเครื่องหมายทางลัดและแอมเปอร์แซนด์มากขึ้นให้ใช้ตัวอย่างอื่น:
["vanessa", "david", "thomas"].map(&:upcase)
#=> ["VANESSA", "DAVID", "THOMAS"]
การแปลงข้อมูลใน Ruby มักเกี่ยวข้องกับการmap
ดำเนินการทั้งหมด การศึกษาmap
& select
พวกเขาเป็นวิธีทับทิมที่มีประโยชน์ที่สุดในห้องสมุดหลัก มันสำคัญเหมือนeach
กัน
( map
เป็นชื่อแทนสำหรับcollect
ใช้สิ่งที่ดีที่สุดสำหรับคุณในเชิงแนวคิด)
ข้อมูลที่เป็นประโยชน์เพิ่มเติม:
หากEnumerableวัตถุที่คุณกำลังทำงานeach
หรือmap
บนมีชุดขององค์ประกอบ Enumerable (แฮชอาร์เรย์) คุณสามารถประกาศแต่ละองค์ประกอบเหล่านั้นภายในท่อบล็อกของคุณต้องการเพื่อ:
[["audi", "black", 2008], ["bmw", "red", 2014]].each do |make, color, year|
puts "make: #{make}, color: #{color}, year: #{year}"
end
# Output:
# make: audi, color: black, year: 2008
# make: bmw, color: red, year: 2014
ในกรณีของแฮช (เช่นเดียวกับEnumerable
วัตถุแฮชคือชุดของทูเปิลพร้อมคำแนะนำพิเศษสำหรับล่าม) "พารามิเตอร์พารามิเตอร์" ตัวแรกคือคีย์ตัวที่สองคือค่า
{:make => "audi", :color => "black", :year => 2008}.each do |k,v|
puts "#{k} is #{v}"
end
#make is audi
#color is black
#year is 2008
ในการตอบคำถามจริง:
สมมติว่าparams
เป็นแฮชนี่จะเป็นวิธีที่ดีที่สุดในการแมปผ่านมัน: ใช้พารามิเตอร์บล็อกสองรายการแทนที่จะเป็นพารามิเตอร์หนึ่งเพื่อจับคู่คีย์ & ค่าสำหรับแต่ละ tuple ที่ถูกตีความในแฮช
params = {"one" => 1, "two" => 2, "three" => 3}
params.each do |k,v|
puts "#{k}=#{v}"
end
# one=1
# two=2
# three=3
NoMethodError: private method 'plusone' called for 1:Fixnum
ทับทิม 2 และ 'args number ผิด' ใน ruby 1.9 / 1.8 อย่างไรก็ตามผมใช้แลมบ์ดา: จากนั้นนำออกมาระบุสัญลักษณ์:plusone = ->(x) { x + 1 }
[1,2,3].map(&plusone)
private
ไว้ในชั้นเรียนที่คุณวางวิธีการของคุณก่อนที่คุณจะวางวิธีการของคุณ
การใช้ทับทิม 2.4 คุณสามารถทำสิ่งเดียวกันได้โดยใช้transform_values
คุณสมบัตินี้สกัดจากรางไปยังทับทิม
h = {a: 1, b: 2, c: 3}
h.transform_values { |v| v * 10 }
#=> {a: 10, b: 20, c: 30}
0..param_count
หมายถึง "ถึงและรวมถึง param_count"
0...param_count
หมายถึง "ไม่เกิน แต่ไม่รวม param_count"
Range#map
ไม่ส่งคืนEnumerable
มันจริงแมปไปยังอาร์เรย์ Range#to_a
มันเป็นเช่นเดียวกับ
มัน "แมป" ฟังก์ชั่นสำหรับแต่ละรายการในEnumerable
- ในกรณีนี้คือช่วง ดังนั้นมันจะเรียกบล็อกที่ส่งผ่านหนึ่งครั้งสำหรับทุกจำนวนเต็มตั้งแต่ 0 ถึงparam_count
(พิเศษ - คุณอยู่ในจุดที่ถูกต้อง) และส่งกลับอาร์เรย์ที่มีค่าส่งคืนแต่ละค่า
Enumerable#map
นี่คือเอกสารสำหรับ collect
นอกจากนี้ยังมีนามแฝง
Range#map
จริงๆแล้วมันแปลงเป็นอาเรย์
Enumerable
เหมือนกัน ฉันคิดว่ามันทำ
แผนที่เป็นส่วนหนึ่งของโมดูลที่นับได้ คล้ายกับ "รวบรวม" ตัวอย่างเช่น:
Class Car
attr_accessor :name, :model, :year
Def initialize (make, model, year)
@make, @model, @year = make, model, year
end
end
list = []
list << Car.new("Honda", "Accord", 2016)
list << Car.new("Toyota", "Camry", 2015)
list << Car.new("Nissan", "Altima", 2014)
p list.map {|p| p.model}
แผนที่แสดงค่าที่วนซ้ำผ่านอาร์เรย์ที่ส่งคืนโดยพารามิเตอร์บล็อก
#each
#each
เรียกใช้ฟังก์ชันสำหรับแต่ละองค์ประกอบในอาร์เรย์ ข้อความที่ตัดตอนมาของรหัสสองต่อไปนี้เทียบเท่า:
x = 10
["zero", "one", "two"].each{|element|
x++
puts element
}
x = 10
array = ["zero", "one", "two"]
for i in 0..2
x++
puts array[i]
end
#map
#map
ใช้ฟังก์ชั่นกับองค์ประกอบของอาร์เรย์แต่ละคืนกลับอาร์เรย์ผล สิ่งต่อไปนี้เทียบเท่า:
array = ["zero", "one", "two"]
newArray = array.map{|element| element.capitalize()}
array = ["zero", "one", "two"]
newArray = []
array.each{|element|
newArray << element.capitalize()
}
#map!
#map!
เป็นเหมือน#map
แต่ปรับเปลี่ยนอาร์เรย์ในสถานที่ สิ่งต่อไปนี้เทียบเท่า:
array = ["zero", "one", "two"]
array.map!{|element| element.capitalize()}
array = ["zero", "one", "two"]
array = array.map{|element| element.capitalize()}
map
เป็นวิธีการทั่วไป "ใช้งานได้" ที่พบในวัตถุนับจำนวนที่ใช้สำหรับเปลี่ยนค่าในลำดับ (โดยมีข้อควรพิจารณาพิเศษ)..
และ...
เป็นวิธีในการสร้างช่วง นอกจากนี้ยังได้คุ้นเคยกับ REPL ที่คุณสามารถลองสิ่งนี้ด้วยตัวคุณเอง! :)